Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.11.2022
Сообщений: 7
1

Access violation reading location 0xFFFFFFFF56389340

26.11.2022, 11:27. Показов 613. Ответов 4

Author24 — интернет-сервис помощи студентам
Есть программа в которой создается матрицы, после чего их надо вывести, задача была вывод сделать через единственную функцию, но почему то он не хочет этого делать выдавая следующую ошибку:

Exception thrown at 0x00007FF682D6190B in parprogrectanglemiddle.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF56389340.

а так же я не понимаю почему в функции в разных циклах где то он требует просто интовую переменную, а где то указатель на нее(int*). Подскажите пожалуйста, как это исправить.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int i, j;
 
void outputMatrixs(int A[], int B[], int** C[],int n)
{
    //Output of matrix A
    printf("matrix A\n");
    for (i = 0; i < n; i++)
    {
        for (int* j = 0; j < n; j++)
            printf("%d ", A[i][j]);
        printf("\n");
    }
    //Output of matrix В
    printf("\nmatrix B\n");
    for (i = 0; i < n; i++)
    {
        for (int* j = 0; j < n; j++)
            printf("%d ", B[i][j]);
        printf("\n");
    }
    //Output of matrix С (Where C is the result of multiplying matrix A by matrix B)
    printf("Result \n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%3d ", C[i][j]);
        printf("\n");
    }
}
 
 
int main()
{
    double time = 0.0;
    clock_t begin = clock();
    const int n = 3;
    int k;                                               
    //enter the number of rows and columns in the matrix
    //printf("Enter n \n");
    //scanf_s("%ld", &n);
    //Memory allocation for three matrices (A,B,C)
    
    int** A = (int**)malloc(n * sizeof(int*));
    int** B = (int**)malloc(n * sizeof(int*));
    int** C = (int**)malloc(n * sizeof(int*)); 
    for (i = 0; i < n; i++)
    {
        A[i] = (int*)malloc(n * sizeof(int));
        B[i] = (int*)malloc(n * sizeof(int));
        C[i] = (int*)malloc(n * sizeof(int));
    }
    //Filling the matrix with random numbers
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            A[i][j] = rand() % 10;
            B[i][j] = rand() % 10;
        }
    //Output of matrix A
    printf("matrix A\n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%d ", A[i][j]);
        printf("\n");
    }
    //Output of matrix В
    printf("\nmatrix B\n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%d ", B[i][j]);
        printf("\n");
    }
 
    /*Matrix multiplication
To multiply matrices by each other, it is necessary that the number of columns 
of matrix A is equal to the number of rows of matrix B. 
To get an element of the first row and the first column from matrix C, 
you need to multiply the elements from the first row of matrix A by the elements 
from the first column of matrix B in turn and add them.To get an element 
of the first row and the second column from the matrix C, you need to multiply 
the elements from the first row of the matrix A by the elements from the second column 
of the matrix B in turn and add them. Etc.The formula looks like this:
A=a(ij) of size m?p;
B=b(ij) of size p?n;
C=c(ij) of size m?n
c(ij)=a(i 1)*b(1 j)+a(i 2)*b(2 j)+...+a(i p)*b(p j).*/
    for (i = 0; i < n; i++)
    {   for (j = 0; j < n; j++)
        {
            C[i][j] = 0;
            for (k = 0; k < n; k++)
            C[i][j] += A[i][k] * B[k][j];
        }
    }
    //Output of matrix С (Where C is the result of multiplying matrix A by matrix B)
    printf("Result \n");
    for (i = 0; i < n; i++)
    {   for (j = 0; j < n; j++)
        printf("%3d ", C[i][j]);
        printf("\n");
    }
    //outputMatrixs(A, B, C, n);
 
    /* find the difference to find the elapsed time
    divided by CLOCKS_PER_SEC to convert to seconds*/
    clock_t end = clock();
    time+= (double)(end - begin) / CLOCKS_PER_SEC;
 
    printf("The program runtime is %lf seconds", time);
    return 0;
    //memory cleansing
        for (i = 0; i < n; i++)
        {
            free(A[i]);
            free(B[i]);
            free(C[i]);
        }
    free(A);
    free(B);
    free(C);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2022, 11:27
Ответы с готовыми решениями:

Ошибка Access violation reading location 0x00000003
Функция должна вывести предложение на украинском языке и напечатать каждое слово с большой буквы....

Ошибка fscanf: Access violation writing location 0xCDCDCDCD
Уважаемые форумчане, пожалуйста помогите разобраться с данной ошибкой. Она возникает при вводе...

Ошибка при запуске программы: Access violation writing location 0x00000000
Нужно было написать программу, которая вычислит через сколько лет утроится население города, если...

Access violation reading location
Помогите пожалуйста! Создаю программу, которая ведет учет данных. В бинарный dat-файл записываются...

Access violation reading location
В функции выбрасывает исключение &quot;Access violation reading location&quot;, с чем может быть связано?...

4
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7794 / 4617 / 2830
Регистрация: 22.11.2013
Сообщений: 13,112
Записей в блоге: 1
26.11.2022, 12:31 2
Лучший ответ Сообщение было отмечено J3metron как решение

Решение

Смешались в кучу кони, люди...

Для матрицы с m строк и n столбцов элементов типа type достаточно m*n*sizeof(type) памяти. При этом элемент (i,j) лежит по индексу n*i+j.

Функции предназначены в том числе и для устранения дублирования кода.
Например, заполнение случайными числами в диапазоне [a,b):
C
1
2
3
4
5
int *vrand(int *v, int n, int a, int b) {
  b-=a;
  for (int i=n; i-->0;) v[i]=a+rand()%b;
  return v;
}
То же самое для произведения матриц:
C
1
2
3
4
5
6
7
8
9
// C(m x n) = A(m x p) * B(p x n)
int *mprod(int *a, int *b, int *c, int m, int p, int n) {
  for (int i=0; i<m; ++j) for (j=0; j<n; ++j) {
    int t=0;
    for (k=0; k<p; ++k) t+=a[p*i+k]*b[n*k+j];
    c[n*i+j]=t;
  }
  return c;
}
Вывод матрицы:
C
1
2
3
4
void mprintf(int *a, int m, int n, int w) {
  for (int i=0; i<m; ++i) {
    for (int j=0; j<m; ++j) printf(" %*d",w,a[n*i+j]); printf("\n");
}
Теперь, когда понадобится, можем с ее помощью выводить матрицы из целых:
C
1
2
3
  printf("A =\n"); vrand(a,n*n,-9,10); mprintf(a,n,n,3);
  printf("B =\n"); vrand(b,n*n,-9,10); mprintf(b,n,n,3);
  printf("C =\n"); mprod(a,b,c,n,n,n); mprintf(c,n,n,3);
А теперь соберем все это в правильном порядке...
1
0 / 0 / 0
Регистрация: 26.11.2022
Сообщений: 7
26.11.2022, 13:14  [ТС] 3
Со всем разобрался, остался только один вопрос, по всей видимости рандомными числами заполняется только первая строка матрицы, и последующие заполняются рандомными числами вне отрезка [a, b]. Я попытался сделать в функции рандома ещё один цикл для сток, но н опять начал ругаться на переменную j, что я не правильно понимаю?

C
1
2
3
4
5
6
7
8
9
10
11
12
int *mrand(int* v, int n, int a, int b)
{
    b -= a;
    for (int i = n; i-- > 0;)
    {
        for(int j = n; j-- > 0;){   //Выражение E0142 должно иметь тип указателя на объект, но оно имеет тип "int"(v[i][j])
            v[i][j] = a + rand() % b;
        }
        
    }
    return v;
}


консоль выводит следующие значения
matrix A
8 2 8
435 1929904624 435
-33686019 5177344 6619246

matrix B
9 8 3
435 1929905584 435
-33686019 7471205 4390973

Result
-269487210 -375386424 35128678
221376258 -557728201 -395004016
-870379365 169155406 -1257106387
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7794 / 4617 / 2830
Регистрация: 22.11.2013
Сообщений: 13,112
Записей в блоге: 1
26.11.2022, 13:47 4
Если все же хочется адресации в виде a[i][j], то и это легко устроить без многократных выделений памяти.
Что представляет собой вариант выше?
C
1
2
3
4
5
6
7
8
9
10
int **mnew(int m, int n) {
  int **a=malloc(m*sizeof(*a));  // блок m указателей
  for (int i=0; i<m ++i)         // каждому указателю ...
    malloc(a[i],n*sizeof(**a));    // ... по блоку из n элементов
  return a;
}
void mfree(int **a, int m) {
  for (int i=0; i<m; ++i) free(a[i]);
  free(a);
}
Не слишком ли много malloc()-ов? Точно, много. Выше уже видели, что для массива достаточно одного с m*n*sizeof(int).
Можем поменять? Можем. Достаточно выделить память за один раз, а указателю на строку присваивать адрес строки массива в этом выделенном блоке. Пробуем:
C
1
2
3
4
5
6
7
8
9
10
11
int **mnew(int m, int n) {
  int **a=malloc(m*sizeof(*a));  // блок m указателей
  a[0]=malloc(m*n*sizeof(**a));  // новый блок m*n элементов
  for (int i=1; i<m; ++i)        // каждому указателю ...
    a[i]=a[0]+n*i;                 // ... адрес начала строки в блоке
  return a;
}
void mfree(int **a) {
  free(a[0]);
  free(a);
}
А нужен ли отдельный malloc() для блока указателей?
Действительно:
C
1
2
3
4
5
6
7
8
9
int **mnew(int m, int n) {
  int **a=malloc(m*sizeof(*a)+m*n*sizeof(**a)); // блок из m указателей и m*n элементов
  a[0]=(int*)(a+m);            // начало блока элементов
  for (int i=1; i<m; ++i)      // каждому указателю ...
    a[i]=a[0]+n*i;               // ... адрес начала строки в блоке
  return a;
}
// очистка теперь стандартная
  free(a);
Добавлено через 1 минуту
Цитата Сообщение от J3metron Посмотреть сообщение
один вопрос
откуда взялся v[i][j]?
Выше было по-другому.
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7794 / 4617 / 2830
Регистрация: 22.11.2013
Сообщений: 13,112
Записей в блоге: 1
26.11.2022, 14:11 5
В сухом остатке
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int *vrand(int *v, int n, int a, int b);
int *mprod(int *a, int *b, int *c, int m, int p, int n);
void mprintf(int *a, int m, int n, int w);
 
int main() {
  int n=3;
  int *a=malloc(n*n*sizeof(*a));
  int *b=malloc(n*n*sizeof(*b));
  int *c=malloc(n*n*sizeof(*c));
  srand(time(0));
  
  printf("A =\n"); vrand(a,n*n,-9,9); mprintf(a,n,n,3);
  printf("B =\n"); vrand(b,n*n,-9,9); mprintf(b,n,n,3);
  printf("C =\n"); mprod(a,b,c,n,n,n); mprintf(c,n,n,3);
 
  free(c); free(b); free(a);
  
  return 0;
}
 
// random from range [a,b]
int *vrand(int *v, int n, int a, int b) {
  b-=a-1;
  for (int i=n; i-->0;) v[i]=a+rand()%b;
  return v;
}
 
// C(m x n) = A(m x p) * B(p x n)
int *mprod(int *a, int *b, int *c, int m, int p, int n) {
  for (int i=0; i<m; ++i) for (int j=0; j<n; ++j) {
    int t=0;
    for (int k=0; k<p; ++k) t+=a[p*i+k]*b[n*k+j];
    c[n*i+j]=t;
  }
  return c;
}
 
void mprintf(int *a, int m, int n, int w) {
  for (int i=0; i<m; ++i) {
    for (int j=0; j<m; ++j) printf(" %*d",w,a[n*i+j]); printf("\n");
  }
}
0
26.11.2022, 14:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2022, 14:11
Помогаю со студенческими работами здесь

Access violation reading location
добрый вечер , что может означать ошибка ? &quot;Exception thrown at 0x00B427CD in...

Access violation reading location
Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения,...

Access violation reading location
Вот есть код. Через раз выдает ошибки, &quot;Exception thrown at 0x00007FF6328E67AF in...

access violation reading location
access violation reading location такая проблема если вести информацию про двух и больше студентов...

ошибка Access violation reading location 0x00000066
Ошибка : Unhandled exception at 0x100e14cf (msvcr100d.dll) in 3.4.exe: 0xC0000005: Access violation...

Подключение DLL, Access violation reading location
Прив! Что я делаю не так? Работаю в Visual Studio. Создаю Win32 project под именем MyDLL. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru