列出的代码来自我正在处理的一个较大的项目(我删除了此发布不需要的几乎所有其他内容),但正常运行时遇到了一些麻烦。我找到了导致错误的行,但我希望对此行造成错误的原因进行解释。
#include <iostream>
#include <tgmath.h>
using namespace std;
int main() {
const int m = 2; // Number of rows
const int n = 2; // Number of cols
int totalPoss = 0; // Number of unique possibile m X n binary matrices
// 2^(m * n) = the number of unique binary
// combinations of m X n matrices
int stop = pow(2, m * n);
// Error when a = 0, 1 | m = 0 | n = 1
for (int a = 0; a < stop; a++) {
int poss[m][n] = {0}; // 2D Array to store each possible matrix
int nextGen[m][n] = {0}; // 2D Array to store the next generation of cells
int rem[m * n]; // 1D Array to store the binary entries of the poss[m][n]
totalPoss = a;
int hold = a; // Stores the current "possibility number" (i.e when
// a = hold = 1 the binary equivilent of 1 will be stored
// in rem[m * n])
// Generate binary number based on whatever a is at current iteration
int c = 0;
while (hold > 0) {
// storing remainder in binary array
rem[c] = hold % 2;
hold = hold / 2;
c++;
}
cout << "Binary: ";
for (int i = 0; i < (m * n); i++) {
cout << rem[i] << " ";
}
cout << endl << endl;
}
cout << "Total possibilities: " << totalPoss+1 << endl;
return 0;
}
有关的行是第19行或int nextGen[m][n] = {0};
。该状态下程序的目的是输出所有可能的4位唯一二进制数。转换为二进制的数字由初始for
循环确定。该数字在while
循环中转换并存储在rem[m][n]
中。除非包含第19行,否则此代码工作正常。无论出于何种原因,创建此2D数组时,0和1的输出均为1 14 0 0,但2-15的输出正确。我的问题是为什么这一行(似乎)不相关的行会破坏我的代码。
谢谢!
rem
尚未完全初始化。分配值的循环仅迭代直到hold
为零,因此它不会设置较高的元素。但是打印它的循环总是打印n * m
元素。
定义nextGen
的效果是偶然的。它可能会影响rem
在内存中的放置位置,从而导致它恰好包含零而不是其他位(并且很可能在没有优化的情况下进行了编译)。
将rem
初始化为全零或更改设置其元素的循环。