嵌套 for 循环不遍历第二个数组
Nested for loop not looping through second array
如何让第二个数组正确循环?这是一个简单的矩阵乘法运算(使用 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] << "\tX\t" << "[" << 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);
//...
}
现在创建代码不再一遍又一遍,加上使用错误变量的问题即使没有消除也已最小化。
话虽如此,这种创建二维数组的方法是最糟糕的方法之一。现在,你的代码有内存泄漏(它仍然被认为是泄漏,即使程序将终止——内存工具如 valgrind 和其他人会在你的程序退出时立即指示错误)。
理想情况下,您可以使用 class 容器 std::vector<int>
来自动处理动态内存管理。
但即使这是一个必须使用 int**
的练习,在这些限制条件下,它仍然是创建二维数组的一种非常糟糕的方法。这是关于这个问题的 answer that goes in detail,为什么它不好,以及如何缓解它。
如何让第二个数组正确循环?这是一个简单的矩阵乘法运算(使用 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] << "\tX\t" << "[" << 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);
//...
}
现在创建代码不再一遍又一遍,加上使用错误变量的问题即使没有消除也已最小化。
话虽如此,这种创建二维数组的方法是最糟糕的方法之一。现在,你的代码有内存泄漏(它仍然被认为是泄漏,即使程序将终止——内存工具如 valgrind 和其他人会在你的程序退出时立即指示错误)。
理想情况下,您可以使用 class 容器 std::vector<int>
来自动处理动态内存管理。
但即使这是一个必须使用 int**
的练习,在这些限制条件下,它仍然是创建二维数组的一种非常糟糕的方法。这是关于这个问题的 answer that goes in detail,为什么它不好,以及如何缓解它。