нарушение прав доступа при чтении из массива двумерных указателей в c ++ - PullRequest
0 голосов
/ 16 апреля 2020

для моего задания мне нужно умножить две матрицы вместе, чтобы заполнить новую матрицу. Я могу использовать только переменные типа указателя. У меня возникает проблема с нарушением прав доступа, когда я пытаюсь умножить их вместе. Это как-то связано с моим массивом двухмерных указателей. Я могу присвоить значения из моего одномерного 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...