元素在编译时切换位置?

Elements switch places on compilation?

我已经 运行 遇到了这个非常奇怪的错误,其中数组的 元素将与另一个 交换位置。我可以通过在编译前手动更改元素来解决这个问题,但为了便于访问,我想保持原样。我的目标是比较位并将结果存储在数组中。在调用该函数后,我没有主动调用任何函数,因此它不会更改数组本身。当我将数组声明为常量时,它做同样的事情。

这是我的数组:

int myconsts[8][8] = {
    { 6, 10, 0, 9, 14, 6, 6, 7 }
};

我的问题是数字 14 (myconsts[4]) 和 7 (myconsts[7]) 会随机交换位置。下面是我如何比较函数中的位

std::array<std::array<int, 4>, 8> myfunct(int arr[][8]) {
    std::array<std::array<int, 4>, 8> arr2;
    int i = 0;
    do {
        std::bitset<4> num1(arr[0][i]);
        std::bitset<4> num2(arr[1][i]);
        std::bitset<4> num3(arr[2][i]);

        int no;
        int no2;
        int no3;

        for (int x = 0; x < 4; x++) {
            int sum = 0;
            std::cout << num1[x] << "   Num: " << num1[0] << num1[1] << num1[2] << num1[3] << std::endl;

        }
        std::cout << " " << std::endl;
        i++;
    } while (i < 8);
    //just testing the logic
    arr2 = { 0 };
    return arr2;
}

输出:

[0]

0   Num: 0110
1   Num : 0110
1   Num : 0110
0   Num : 0110

[1]

0   Num : 0101
1   Num : 0101
0   Num : 0101
1   Num : 0101

[2]

0   Num : 0000
0   Num : 0000
0   Num : 0000
0   Num : 0000

[3]

1   Num : 1001
0   Num : 1001
0   Num : 1001
1   Num : 1001

这是它与原始元素[7]交换位置的地方! [4]

0   Num : 0111
1   Num : 0111
1   Num : 0111
1   Num : 0111

[5]

0   Num : 0110
1   Num : 0110
1   Num : 0110
0   Num : 0110

[6]

0   Num : 0110
1   Num : 0110
1   Num : 0110
0   Num : 0110

[7]

1   Num : 1110
1   Num : 1110
1   Num : 1110
0   Num : 1110

是元素[0..7],中间每space代表一个新元素。我不确定它是否在所有编译器上都相同。

我不明白你在描述什么。

这是我对你的输出的注释:

0   Num : 0111  // This is 2 + 4 + 8 = 14
1   Num : 0111
1   Num : 0111
1   Num : 0111

0   Num : 0110 // This is 2 + 4 = 6
1   Num : 0110
1   Num : 0110
0   Num : 0110

0   Num : 0110 // This is 2 + 4 = 6
1   Num : 0110
1   Num : 0110
0   Num : 0110


1   Num : 1110 // This is 1 + 2 + 4 = 7
1   Num : 1110
1   Num : 1110
0   Num : 1110

看起来你刚刚被甩了:..., 14, 6, 6, 7 };
这是数组的最后 4 个元素。

我会说一切看起来都是正确的。

也许您在屏幕上向后读取位,因为 LSB(最低有效位)通常 放在 最右边,你把它放在最左边

但是您的代码运行良好。