C++中的动态多维数组

Dynamic Multidimensional array in C++

本文关键字:数组 动态 C++      更新时间:2023-10-16

我使用动态多维数组在c++中制作了矩阵乘法程序。问题是当我输入测试值时矩阵A=row1{1},row2{2}矩阵B=row1{1,2,3},它在用户所在的循环中停止工作输入第一个数组的值,我使用调试找到了它。但当我进入时程序运行良好矩阵A=行1{1,2},行2{3,4}矩阵B=行1{5,6},行1{7,8}

我希望这个程序是一个通用程序,可以乘以所有矩阵

#include <iostream>
using namespace std;
class Lab_02
{
public:
    void Product(){
    int a1Rows, a1Columns;
    int a2Rows, a2Columns;
    cout << "Plz Enter the no. of rows for Array 1      :";
    cin >> a1Rows;
    cout << "Plz Enter the no. of columns for Array 1   :";
    cin >> a1Columns;
    cout << "Plz Enter the no. of rows for Array 2      :";
    cin >> a2Rows;
    cout << "Plz Enter the no. of columns for Array 2   :";
    cin >> a2Columns;
    int **dynamicArray = 0;
    int **dynamicArray2 = 0;
    int **dynamicArray3 = 0;
    cout << endl;

    for (int i = 0; i < a1Rows; i++)
    {
        dynamicArray3 = new int *[a1Rows];
    }
    for (int i = 0; i < a2Columns; i++)
    {
        dynamicArray3[i] = new int[a2Columns];
    }

    // memory allocated for elements of rows. 
    for (int i = 0; i < a1Rows; i++)
    {
        dynamicArray = new int *[a1Rows];
    }
    // memory allocated for  elements of each column.  
    for (int i = 0; i < a1Columns; i++)
    {
        dynamicArray[i] = new int[a1Columns];
    }

    // memory allocated for elements of rows. 
    for (int i = 0; i < a2Rows; i++)
    {
        dynamicArray2 = new int *[a2Rows];
    }
    // memory allocated for  elements of each column.  
    for (int i = 0; i < a2Columns; i++)
    {
        dynamicArray2[i] = new int[a2Columns];
    }

    cout << "enter the values or array 1 n";
    for (int i = 0; i < a1Rows; i++)
    {
        for (int j = 0; j < a1Columns; j++)
        {
            cout << "array[" << i << "][" << j << "]t";
            cin >> dynamicArray[i][j];
        }
    }
    cout << "enter the values or array 2 :n";
    for (int i = 0; i < a2Rows; i++)
    {
        for (int j = 0; j < a2Columns; j++)
        {
            cout << "array[" << i << "][" << j << "]t"; 
            cin >> dynamicArray2[i][j];
        }
    }

    int sum; 

    for (int i = 0; i < a1Rows; i++)
    {
        for (int j = 0; j < a1Columns ; j++)
        {
            sum = 0;
            for (int k = 0; k <  a2Columns ; k++)
            {
                sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]);
            }
            dynamicArray3[i][j] = sum;
        }
    }

        cout <<"Result" << endl << endl;
        for (int i = 0; i < a1Rows; i++)
        {
            for (int j = 0; j < a2Columns; j++)
            {
                cout << dynamicArray3[i][j] << "t";
            }
            cout << endl;
        }

    }
   };

        void main(void)
        {
         Lab_02 object;   
           object.Product();
          }

你的高考内存分配是个问题。将它们更改为类似以下的内容

// memory allocated for elements of rows. 
dynamicArray = new int *[a1Rows];
// memory allocated for  elements of each column.  
for (int i = 0; i < a1Rows; i++)
{
    dynamicArray[i] = new int[a1Columns];
}

您需要为行分配一个数组,然后在行上循环并分配列。

代码的问题是不应该在循环中分配"行"。您只需要为行进行一次分配,然后循环为每一行分配数据。

例如,代替这个:

for (int i = 0; i < a1Rows; i++)
{
    dynamicArray = new int *[a1Rows];
}
// memory allocated for  elements of each column.  
for (int i = 0; i < a1Columns; i++)
{
    dynamicArray[i] = new int[a1Columns];
}

正确的方法是:

dynamicArray = new int *[a1Rows];
for (int i = 0; i < a1Columns; i++)
{
    dynamicArray[i] = new int[a1Columns];
}

你在每个循环中都犯了同样的错误。

还有一些要点:

  1. 无法解除分配已分配的内存
  2. 如果您使用std::vector,那么事情会变得容易得多
  3. 在执行sum循环之前,您需要检查矩阵是否是可多重分解的。由multiplyable表示矩阵A和B的列和行的数量满足A和B相乘的要求。

    for (int i = 0; i < a1Rows; i++)
    {
        for (int j = 0; j < a1Columns; j++)
        {
            sum = 0;
            for (int k = 0; k < a2Columns; k++)
                sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]);
            dynamicArray3[i][j] = sum;
        }
    }
    

如果dynamicArray1dynamicArray2在相乘之前没有必要的列和行数,则此循环将失控。

首先,在相乘之前应进行以下测试:

if (a1Columns != a2Rows)
    return;

其次,您的k循环错误。应该是这样的:

for (int k = 0; k < a2Rows; k++)
    sum = sum + (dynamicArray[i][k] * dynamicArray2[k][j]);
dynamicArray3[i][j] = sum;