Подтвердить что ты не робот

Работа на... может быть undefined?

У меня есть следующий код

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

4b9b3361

Ответ 1

Строка 77 - это строка

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

Вы меняете trackTail[nodeNumber-1] дважды между точками последовательности: один раз через ++ и один раз через назначение.

Это undefined поведение.

Средство состоит в том, чтобы перефразировать оператор, например:

trackTail[nodeNumber-1] = (trackTail[nodeNumber-1] + 1) % 10;

или так:

trackTail[nodeNumber-1]++;
trackTail[nodeNumber-1] %= 10;

Ответ 2

Вы изменяете trackTail[nodeNumber - 1] между точками последовательности. Это как вы назначаете

i = ++i;

который также является undefined.

Измените свой код на что-то вроде этого:

trackTail[nodeNumber - 1] = (trackTail[nodeNumber - 1] + 1) % 10;

Ответ 3

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

Да, это поведение undefined, как указано в сообщении об ошибке. Вам не разрешается изменять одно и то же значение дважды без точки последовательности между ними. В этом случае это означает, что вам не разрешено увеличивать trackTail[nodeNumber-1] с помощью ++ и переназначать его с помощью =.

Если вы просто используете + 1 вместо ++, он будет работать нормально.