动态数组C++
Dynamic arrays C++
我是 C++ 的初学者,我需要制作一个程序来乘以两个矩阵。我已经了解数组的概念,以便制作动态矩阵。在制作和填充矩阵后,我面临的问题是我无法访问它。当我运行程序并刚刚用函数填充第二个数组时,它突然停止:
void read_matrix(int** matrix, int row, int col)
{
cout << "Enter a matrixn";
matrix = new int*[row];
for(int i = 0; i < row; i++)
matrix[i] = new int[col];
if (!matrix){
cerr << "Can't allocate spacen";
}
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;
}
我不明白为什么它不起作用。 我认为我过滤矩阵的方式有问题,或者我从一个函数发送到另一个函数的方式做错了什么。
谢谢
大卫
你的第一个问题是你没有分配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。
您没有在任何地方分配result
矩阵,因此您的multiply_matrix
函数正在取消引用空指针并写入随机内存。
与其(错误地)手动分配和(不)解除分配内存,不如对数组使用 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);
}
也有一些方法可以在一行代码中做到这一点,但我会像这样展示基本思想。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '