Как использовать двойную точку для обработки матрицы? - PullRequest
0 голосов
/ 04 мая 2020

Я хочу реализовать матричное умножение в c ++. А вот мой код:


#include"math.h";
#include <iostream>

using namespace std;
int** create_matrix(int rows, int cols);
int** calculate_matrix(int** matrix1, int** matrix2, int row_1, int col_1, int row_2, int col_2);
void printMatrix(int** matrix, int rows, int cols);

void main(int argc, char** argv) {
int matrix_A[3][2] = { {1,2},{3,4},{5,6} };
    int matrix_B[2][3] = { {1,2,5},{3,4,6} };

    int* matrix_A_point = &matrix_A[0][0];
    int* matrix_B_point = &matrix_B[0][0];

    int** matrix_A_point_final = &matrix_A_point;
    int** matrix_B_point_final = &matrix_B_point;

    int** new_matrix = calculate_matrix(matrix_A_point_final, matrix_B_point_final, 3, 2, 2, 3);

    printMatrix(new_matrix, 3, 3);
}



int** create_matrix(int rows, int cols) {
    //create the new matrix
    int** matrix = new int* [rows];
    for (int i = 0; i < rows; i++) {
        matrix[i] = new int[cols];
    }

    return matrix;


}


int** calculate_matrix(int** matrix1, int** matrix2,int row_1,int col_1,int row_2,int col_2) {
    //multiplication the matrixs
    int** new_matrix = create_matrix(row_1, col_2);
    if (col_1 == row_2) {
        cout << "The two matrixs can multiplicate!" << endl;

        for (int i = 0; i < row_1; i++) {
            for (int j = 0; j < col_2; j++) {

                new_matrix[i][j] = 0;
                for (int m1_col = 0; m1_col < col_1; m1_col++) {
                    new_matrix[i][j] = matrix1[i][m1_col] * matrix2[m1_col][j];
                }
            }
        }


    }
    else {
        cout << "The two matrixs can't multiplicate!" << endl;

    }
    return new_matrix;



}

void printMatrix(int** matrix, int rows, int cols) {

    for (int i = 0; i < rows; ++i) {
        cout << "the line of: " << i;
        for (int j = 0; j < cols; ++j) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

Однако, он сообщает о месте чтения нарушения доступа, когда я запускаю строку: new_matrix [i] [j] = matrix1 [i] [m1_col] * matrix2 [m1_col] [j];

Exception thrown at 0x00007FF6F6DA4997 in Assessment_2.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

Unhandled exception at 0x00007FF6F6DA4997 in Assessment_2.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

Exception thrown at 0x00007FF6F6DA4997 in Assessment_2.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

Unhandled exception at 0x00007FF6F6DA4997 in Assessment_2.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

Exception thrown at 0x00007FF6F6DA4997 in Assessment_2.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

Unhandled exception at 0x00007FF6F6DA4997 in Assessment_2.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

Кажется, мой второй указатель указывает неверное место. Как справиться с проблемой? Пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

В этой строке:

int** matrix_A_point_final = &matrix_A_point;

Это не то, что вы думаете. Ваши стековые матрицы (matrix_A и matrix_B) представляют собой непрерывные числа, представляющие все строки и столбцы.

Ваши динамические c матрицы представляют собой строки указатели на столбцы. Это разные вещи, и вы смешиваете те, у которых плохие результаты.

Обратите внимание, что использование необработанного выделения обычно не одобряется, и использование умных указателей, векторов или классов-оболочек было бы намного лучшей идеей и помогло бы избежать этой проблемы. .

Однако, быстрое исправление будет создавать matrix_A и matrix_B с использованием create_matrix и заполнять их вручную.

Также эта строка:

new_matrix[i][j] = matrix1[i][m1_col] * matrix2[m1_col][j];

Предположительно должно быть:

new_matrix[i][j] += matrix1[i][m1_col] * matrix2[m1_col][j];
0 голосов
/ 04 мая 2020
#include<iostream>

включает

с использованием пространства имен std;

int main () {

int** A;
int* B;
int Row, Col;

cout<<"Enter Row:";
cin>>Row;
cout<<"Enter column:";
cin>>Col;

A = new int* [Row];
B = new int[Row];

for(int i = 0; i < Row; i++)
{

    A[i] = new int [Col];

}

cout<<"OK!\nEnter:";

for(int j = 0; j < Row; j++)
   for(int k = 0; k < Col; k++)
   {

    cin>>A[j][k];
    cout<<"\n";

   }

   cout<<"\n";
   cout<<"Your matrix is:\n";

   for(int j = 0; j < Row; j++)
   {
      for(int k = 0; k < Col; k++)
      {

        cout<<A[j][k]<<"  ";

      }

      cout<<endl;

    }


getch();
return 0;

}

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