для моего задания мне нужно умножить две матрицы вместе, чтобы заполнить новую матрицу. Я могу использовать только переменные типа указателя. У меня возникает проблема с нарушением прав доступа, когда я пытаюсь умножить их вместе. Это как-то связано с моим массивом двухмерных указателей. Я могу присвоить значения из моего одномерного a1d
без проблем, но я не могу присвоить значения из моего двумерного массива a2d
матрице. Я попытался сохранить значение из a2d
во временную переменную типа int для тестирования, и оно без проблем сохранится в temp
. Но я все еще получаю нарушение прав доступа при попытке сохранить значение от temp
до matrix
. Я не получаю ошибку, если не пытаюсь присвоить a2d
значения матрице, поэтому это не может быть ошибкой при запуске за пределы массива. В a2d
хранятся значения, поскольку они выводятся на консоль при заполнении filla2d
. Они все в одном классе вместе. Я прикреплю код ниже, все, что я сделал в основном, это вызов функций. Когда я проверяю a2d
в режиме отладки, он показывает только одно значение / адрес, но выводит все свои значения на консоль при вызове, поэтому я не понимаю.
class matrices
{
private:
int* a1d[5];
int** a2d = new int*[5];
public:
int* matrix[50];
matrices();
~matrices();
int* filla1d();
int* filla2d();
int* multiply();
};
int* matrices::filla1d() {
for (int i = 0; i < 5; i++) {
a1d[i] = new int;
}
for (int i = 0; i < 5; i++) {
*a1d[i] = rand() % 10 + 1;
}
return *a1d;
}
int* matrices::filla2d() {
for (int i = 0; i < 5; i++) {
a2d[i] = new int[10];
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 10; j++) {
a2d[i][j] = rand() % 10 + 1;
cout << a2d[i][j] << endl;//this outputs all of the values to the console no problem.
}
}
return *a2d;
}
int* matrices::multiply() {
int *temp;
for (int i = 0; i < 50; i++) {
matrix[i] = new int;
}
int index1 = 0;
int index2 = 0;
for (int i = 0; i < 50; i++) {
*matrix[i] = a2d[index1][index2] * *a1d[index1];//access violation thrown here
temp = &a2d[index1][index2];//this works no problem
*matrix[i] = *temp;//access violation thrown here
index1++;
index2++;
}
int index = 0;//This is the correct style loop, not what is above
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 10; j++) {
*matrix[index] = a2d[i][j] * *a1d[i];
index++;
}
}
return *matrix;
}
Вы можете увидеть выше, где я прокомментировал расположение ошибки нарушения доступа. Следует отметить, что если я настрою его так, чтобы заполнить матрицу только значениями a1d
, то нарушения не будет.
Моя проблема, как указано в комментариях, заключается в том, что я увеличивал оба индексных объекта до 50. Мне пришлось изменить его, чтобы он был вложенным для l oop, и я больше не получаю ошибку. Я не знаю, почему visual studio выдала мне ошибку только при использовании a2d, а не a1d.