【问题标题】:Dynamic arrays C++动态数组 C++
【发布时间】:2013-09-10 20:17:40
【问题描述】:

我是 C++ 的初学者,我需要编写一个程序来将两个矩阵相乘。为了制作动态矩阵,我已经了解了数组的概念。我在制作和填充矩阵后面临的问题是我无法访问它。当我运行程序并用函数填充第二个数组时它突然停止:

void read_matrix(int** matrix, int row, int col)
{

cout << "Enter a matrix\n";

matrix = new int*[row];
for(int i = 0; i < row; i++)
    matrix[i] = new int[col]; 

if (!matrix){
    cerr << "Can't allocate space\n";
}

for(int i = 0; i < row; i++){
    for (int j = 0; j < col; j++){
        cin >> matrix[i][j];
    }
}
}

但是根据我的编译器,在程序停止后,在这个函数的最后一个循环之后会有一个箭头指向

void multiply_matrix(int** matrix1, int rows1, int cols1, int** matrix2, int rows2, int cols2, int** result)
{

for(int i = 0; i < rows1; i++){
    for(int j = 0; j < cols2; j++){
        for (int k = 0; k < rows2; k++){
            result[i][j] += matrix1[i][k] * matrix2[k][j];
        }
    }
}

我的主要功能是

int main ()
{

//matrices and dimensions
int rows1, cols1, rows2, cols2; 
int **matrix1 = 0, **matrix2 = 0, **result = 0; 

//TODO: readin matrix dimensions
cout << "Enter matrix dimensions \n";
cin >> rows1 >> cols1 >> rows2 >> cols2;

if(cols1 != rows2){
    cout << "Error!";
    terminate();
}

    //memory for result matrix
    result = new int*[rows1];
       for(int i = 0; i < rows1; i++)
       result[i] = new int[cols2];


// Read values from the command line into a matrix 
read_matrix(matrix1, rows1, cols1); 
read_matrix(matrix2, rows2, cols2);     

// Multiply matrix1 one and matrix2, and put the result in matrix result
multiply_matrix(matrix1, rows1, cols1, matrix2, rows2, cols2, result);

print_matrix(result, rows1, cols2);

//TODO: free memory holding the matrices

return 0;   

}

我不明白为什么它不起作用。我认为我填充矩阵的方式有问题,或者我将一个矩阵从一个函数发送到另一个函数的方式有问题。

谢谢,

大卫

【问题讨论】:

  • 您可能了解动态数组,但您不了解参数传递。 void read_matrix(int** matrix, int row, int col); ... int **matrix1 = 0; ... read_matrix(matrix1, rows1, cols1);不会改变matrix1 的值。更改发生在read_matrix 函数内部,main 中matrix1 的值完全不受影响。即使你调用了read_matrix,它仍然是0。如果你想要一个函数返回一个值,那么使用return,或者使用引用。

标签: c++ arrays function dynamic matrix


【解决方案1】:

您的第一个问题是您没有分配result 矩阵。

您的第二个问题是您也没有分配其他矩阵。

read_matrix 将分配的内存分配给您传递给它的参数。
不幸的是,该参数是main 中指针的副本,因此效果是函数本地的。

要修复它,您可以传递对要分配给的变量的引用:

void read_matrix(int**& matrix, int row, int col);

或者,更好的是,从函数中返回正确的值:

int** read_matrix(int row, int col);
// ...
matrix1 = read_matrix(rows1, cols1);

附带说明:您只需要输入两个维度 - 如果第一个矩阵是 M x N,另一个必须是 N x M。

【讨论】:

  • 非常感谢 molbnilo!我读过它,但没想到是这样。使用函数中的“&”,整个程序就可以工作了!但我还有一个问题,为了了解发生了什么,我写了“cout
  • @DavidKester 您在数组外部进行索引,这会导致未定义的行为。在这种情况下,你很幸运,它崩溃了。
【解决方案2】:

您没有在任何地方分配您的 result 矩阵,因此您的 multiply_matrix 函数正在取消引用空指针并写入随机内存。

【讨论】:

  • 你是对的,我忘记了,但是当我在主 cout 中尝试这个时它也会给我错误
  • @DavidKester 也许您正在访问输入行、列边界之外的单元格?
  • 我为结果矩阵添加了内存
  • 您为 rows1、cols1、rows2、cols2 提供什么值?
  • 输入矩阵尺寸 2 2 2 2 输入矩阵 1 1 1 1 输入矩阵 2 2 2 2 程序接收信号:“EXC_BAD_ACCESS”。 sharedlibrary apply-load-rules all kill 当前语言:auto;目前c++退出
【解决方案3】:

您应该对数组使用std::array 或'std::vector,而不是(错误地)手动分配和(不)释放内存。由于您正在动态拉入矩阵大小,这将引导您到std::vector

简单示例:

std::vector<std::vector<int> > matrix;
for (int i = 0; i < ROW_COUNT; i++)
{
    std::vector<int> row;
    for (int j = 0; j < COL_COUNT; j++)
    {
        row.push_back(RECORD[i][j]);
    }
    matrix.push_back(row);
}

也有一些方法可以在一行代码中完成,但我将保持这样的方式来演示基本思想。

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2013-07-20
    • 2018-07-29
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多