私は次のコードを持っています
FRAME frameArray[5][10]; // Create the array of frames
int trackBufferFull[5] = {0, 0, 0, 0, 0};// Keeps track of how full the buffer for each node is
int trackFront[5] = {0, 0, 0, 0, 0}; // Array to keep track of which is the front of the array
int trackTail[5] = {0, 0, 0, 0, 0};
// Function to add to the array (CHANGE int frame)
void addFrame (int nodeNumber, FRAME frame)
{
//Calc tail
int tail = trackTail[nodeNumber-1];
// Calc frames in buffer
int framesinBuffer = trackBufferFull[nodeNumber-1];
if (framesinBuffer == 10)
{
printf("Buffer is full\n");
}
else
{
// Add frame to frameArray
frameArray[nodeNumber-1][tail] = frame;
printf("\nAdded a frame in node: %i to the buffer\n", nodeNumber);
// Increment the count
trackBufferFull[nodeNumber-1]++;
trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
}
}
FrameArrayに使用する配列は、長さ10のラップアラウンド/サイクリック配列であるため、なぜコードがありますか
trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
すべてがスタンドアロンファイルで完全に機能しますが、大きなファイル内で実行すると、次のコンパイルエラーが発生します。
$ cnet GARETH -m 30
compiling gareth.c
gareth.c: In function ‘addFrame’:
gareth.c:77:27: error: operation on ‘trackTail[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
gareth.c: In function ‘removeFirstFrame’:
gareth.c:98:28: error: operation on ‘trackFront[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
gareth.c:105:1: error: control reaches end of non-void function [-Werror=return-type]
cc1: all warnings being treated as errors
行77は行です
trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
助けて。
行番号とエラーを並べたコードを見るために、画像をアップロードしました: http://i.imgur.com/wyO5a.png
行77は行です
trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
変更していますtrackTail[nodeNumber-1]
を2回 シーケンスポイント :から1回まで++
、および割り当てを通じて1回。
これは 未定義の動作 です。
対処法は、ステートメントを次のように言い換えることです。
trackTail[nodeNumber-1] = (trackTail[nodeNumber-1] + 1) % 10;
またはそのように:
trackTail[nodeNumber-1]++;
trackTail[nodeNumber-1] %= 10;
変更していますtrackTail[nodeNumber - 1]
シーケンスポイント間。あなたが割り当てているようなものです
i = ++i;
これも未定義の動作です。
コードを次のように変更します。
trackTail[nodeNumber - 1] = (trackTail[nodeNumber - 1] + 1) % 10;
trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
ええ、それはエラーメッセージが示すように未定義の動作です。間にシーケンスポイントがないと、同じ値を2回変更することはできません。この場合、trackTail[nodeNumber-1]
を使用して++
をインクリメントし、=
を使用して再割り当てすることはできません。
+ 1
の代わりに++
を使用するだけであれば、問題なく動作します。