programing

...에 대한 작업이 정의되지 않았을 수 있습니다.

goodsources 2022. 9. 13. 22:17
반응형

...에 대한 작업이 정의되지 않았을 수 있습니다.

다음과 같은 코드를 가지고 있습니다.

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회 ~++과제로 한 번.

이것은 정의되지 않은 동작입니다.

해결 방법은 다음과 같이 문장을 바꾸는 것입니다.

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;

네, 에러 메시지에 나타난 대로 정의되지 않은 동작입니다.같은 값을 두 번 수정하려면 시퀀스 포인트가 있어야 합니다.이 경우, 두 가지 증분이 모두 허용되지 않습니다.trackTail[nodeNumber-1]사용.++를 사용하여 재할당합니다.=.

그냥 사용하면+ 1대신++정상적으로 동작합니다.

언급URL : https://stackoverflow.com/questions/10623114/operation-on-may-be-undefined

반응형