奇妙なCの動作が発生しました。私は一見無関係な関数呼び出しの後に変更されている配列(SHOULD_NOT_CHANGEというラベルが付けられている)を持っています。私の配列はグローバルではなく、関数呼び出しには特定の配列が含まれていません。誰かが何が起こっているか把握できれば、私は大いに感謝するでしょう。ここでの主である:ここでは関連のない関数で配列が変更されました
int main(){
int generate4[16] = {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int propagate4[16] = {0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0};
int SHOULD_NOT_CHANGE[4] = {0, 1, 0, 0};
int carry_in16[4] = {1,2,1,1};
int carry_in4[16] = {0};
printf("\nShould be 1: %d", SHOULD_NOT_CHANGE[0]);
printf("\nShould be 0: %d", SHOULD_NOT_CHANGE[1]);
printf("\nSHOULD NOT CHANGE : ");
print_binary_array(SHOULD_NOT_CHANGE, 4);
// Here is where the problem is
carry(propagate4, generate4, carry_in4, carry_in16, 64, 4);
printf("\n\nShould be 0: %d", SHOULD_NOT_CHANGE[0]);
printf("\nShould be 1: %d", SHOULD_NOT_CHANGE[1]);
printf("\nSHOULD NOT CHANGE : ");
print_binary_array(SHOULD_NOT_CHANGE, 4);
return 0;
}
は犯人機能である:
void carry(int* p, int* g, int* carry_in, int* group_carry, int size, int block)
{
for (int j = 0; j < block; j++){
carry_in[j] = g[j] + p[j] * group_carry[j];
for (int i = 1; i < block*4; i++){
carry_in[4*j+i] = g[4*j+i] + p[4*j+i] * group_carry[j];
}
}
}
そして、ここでは私の出力です:
Should be 0: 0
Should be 1: 1
SHOULD NOT CHANGE : 0010
Should be 0: -13136
Should be 1: 0
SHOULD NOT CHANGE : 1-21471898220-13136
'carry_in [4 * j + i]' - これはmaxで 'carry_in [4 * 3 + 15]'と評価されます。これは、配列の終りを読み込み、セグメンテーションは保証されません)。 –
@KarlReid OPがそれを受け入れることができるように、あなたのコメントを回答として投稿してください。 –