元素在编译时切换位置?
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(最低有效位)通常 放在 最右边,你把它放在最左边。
但是您的代码运行良好。
我已经 运行 遇到了这个非常奇怪的错误,其中数组的 元素将与另一个 交换位置。我可以通过在编译前手动更改元素来解决这个问题,但为了便于访问,我想保持原样。我的目标是比较位并将结果存储在数组中。在调用该函数后,我没有主动调用任何函数,因此它不会更改数组本身。当我将数组声明为常量时,它做同样的事情。
这是我的数组:
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(最低有效位)通常 放在 最右边,你把它放在最左边。
但是您的代码运行良好。