49

次のコードがあります

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にアップロードしました。

4

3 に答える 3

72

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;
于 2012-05-16T16:55:01.357 に答える
9

trackTail[nodeNumber - 1]シーケンスポイント間で変更しています。それはあなたが割り当てているようなものです

i = ++i;

これも未定義の動作です。

コードを次のように変更します。

trackTail[nodeNumber - 1] = (trackTail[nodeNumber - 1] + 1) % 10;
于 2012-05-16T16:54:46.660 に答える
6
trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

うん、それはエラーメッセージが言うように未定義の振る舞いです。間にシーケンスポイントがない場合、同じ値を2回変更することはできません。この場合、を使用してインクリメントすることと、trackTail[nodeNumber-1]を使用++して再割り当てすることの両方を許可されていないことを意味します=

+ 1の代わりに使用する場合は、正常++に機能します。

于 2012-05-16T16:55:47.433 に答える