嵌套的 for 循环不循环通过第二个数组

Nested for loop not looping through second array

本文关键字:循环 第二个 数组 for 嵌套      更新时间:2023-10-16

如何让第二个数组正确循环?这是一个简单的矩阵乘法运算(使用 Visual Studio 2019(,arr 正在循环,但 arr2 没有完全循环。只有前 2 个元素乘以 arr 的所有元素。

#include <iostream>
using namespace std;
int main() {
int r1 = 2, c1 = 3, r2 = 3, c2 = 3;
int** arr = new int* [r1];
for (int i = 0; i < c1; i++) {
arr[i] = new int[c1];
}
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c1; j++) {
arr[i][j] = j;
}
}
int** arr2 = new int*[r2];
for (int i = 0; i < c2; i++) {
arr2[i] = new int[c2];
}
for (int i = 0; i < c2; i++) {
for (int j = 0; j < r2; j++) {
arr2[i][j] = j;
}
}
int** arr3 = new int*[r1];
for (int i = 0; i < c2; i++) {
arr3[i] = new int[c2];
}
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
arr3[i][j] = 0;
}
}

for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
for (int g = 0; g < c1; g++) {
arr3[i][j] += arr[i][g] * arr2[g][j];
cout << "[" << i << "][" << g << "] " << arr[i][g] << "tXt" << "[" << g << "][" << j << "] " << arr2[g][j] << " => " << arr3[i][j] << endl;
}
}
}
cout << "n" << endl;
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
cout << "New Array Element: [" << i << "][" << j << "] => " << arr3[i][j] << endl;
}
}
return 0;
}

你在所有的循环中都犯了相同的基本错误——这个错误是你没有正确地迭代行。

当应该使用行计数时,您正在使用列计数:

int** arr = new int* [r1];
for (int i = 0; i < c1; i++) {  // <-- This should be i < r1, not i < c1;
arr[i] = new int[c1];
}

其次,你可以编写一个函数来减少出错的机会,并且也有更好的机会找到这样的错误:

int **createArray(int rows, int cols)
{ 
int** arr = new int* [rows];
for (int i = 0; i < rows; i++) { 
arr[i] = new int[cols];
}

for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = j;
}
}
return arr;
}
int main()
{
int r1 = 2, c1 = 3, r2 = 3, c2 = 3;
int** arr = createArray(r1, c1);
int** arr2 = createArray(r2,c2);
int** arr3 = createArray(r1,c2);
//...
}

现在,创建代码不会一遍又一遍地重复,而且使用错误变量的问题即使没有消除,也会最小化。


话虽如此,这种创建 2D 数组的方式是最糟糕的方法之一。 现在,你的代码有内存泄漏(它仍然被认为是泄漏,即使程序将终止 - 内存工具,如valgrind和其他工具会在程序退出后立即指示错误(。

理想情况下,您将使用容器类(如std::vector<int>(自动处理动态内存管理。

但即使这是一个必须使用int**的练习,它仍然是在这些约束下创建二维数组的一种非常糟糕的方法。 这里有一个关于这个问题的答案,为什么它不好,以及如何缓解它。