[0的不相关循环的2D破坏逻辑数组-C ++

问题描述 投票:0回答:1

列出的代码来自我正在处理的一个较大的项目(我删除了此发布不需要的几乎所有其他内容),但正常运行时遇到了一些麻烦。我找到了导致错误的行,但我希望对此行造成错误的原因进行解释。

#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的输出正确。我的问题是为什么这一行(似乎)不相关的行会破坏我的代码。

谢谢!

c++ arrays multidimensional-array binary
1个回答
0
投票

rem尚未完全初始化。分配值的循环仅迭代直到hold为零,因此它不会设置较高的元素。但是打印它的循环总是打印n * m元素。

定义nextGen的效果是偶然的。它可能会影响rem在内存中的放置位置,从而导致它恰好包含零而不是其他位(并且很可能在没有优化的情况下进行了编译)。

rem初始化为全零或更改设置其元素的循环。

© www.soinside.com 2019 - 2024. All rights reserved.