2012-05-16 19 views
29

我有以下代码...上的操作可能未定义?

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

+1

http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points - 你是_lucky_你的编译器在那里警告你。 – Mat

+1

很少出现的问题。 +1。 – 2012-05-16 16:57:23

回答

45

77号线是你正在改变trackTail[nodeNumber-1]两次sequence points之间的界限

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

:一旦通过++,一旦通过分配。

这是undefined behaviour

补救的办法是修改语句,例如像这样:

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

或像这样:

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

非常感谢你,你第一次正确解决它。我现在可以去睡觉了:) 我用'(trackTail [nodeNumber-1] + 1)%10;'哪个H @ CO3也有,但不久之后。 – gbhall

5

你修改序列点之间trackTail[nodeNumber - 1]。这就像你正在分配

i = ++i; 

这也是未定义的行为。

更改您的代码是这样的:

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

您提出的解决方案对我来说看起来不对。你在一行上添加1到'trackTail [nodeNumer - 1]',然后再增加* *使用++。 – sepp2k

+0

没有。向tracktail添加一个[nodeNumber + 1]不会将增加的值赋值给它。这就是为什么需要加热。OP希望模数在数值*加上一个*上执行,并且同时想要增加该数组元素的值。 – 2012-05-16 16:58:57

+1

什么?递增的值(模10)被分配给'trackTail [nodeNumer-1]',因为那里有一个赋值运算符,其右操作数是递增值。在执行trackTail [nodeNumber - 1] =(trackTail [nodeNumber - 1] + 1)%10;'trackTail [nodeNumber - 1]'的值后,肯定是其前值+ 1模10。随后的行,它将是其原始值加上2(模10,除非原始值是8,在这种情况下现在将是10)。 – sepp2k

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

是的,这只是作为错误信息说未定义的行为。您不允许两次修改相同的值,而没有两者之间的序列点。在这种情况下,这意味着您不允许使用++增加trackTail[nodeNumber-1]并使用=重新分配它。

如果您只是使用+ 1而不是++,它会正常工作。

+0

非常感谢sepp。 – gbhall