我有以下代码
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
答案 0 :(得分:51)
第77行是
行trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
您要在sequence points之间两次更改trackTail[nodeNumber-1]
:一次到++
,一次到分配。
补救措施是重新陈述语句,例如:
trackTail[nodeNumber-1] = (trackTail[nodeNumber-1] + 1) % 10;
或者像这样:
trackTail[nodeNumber-1]++;
trackTail[nodeNumber-1] %= 10;
答案 1 :(得分:5)
您正在修改序列点之间的trackTail[nodeNumber - 1]
。这就像你在分配
i = ++i;
这也是未定义的行为。
将您的代码更改为以下内容:
trackTail[nodeNumber - 1] = (trackTail[nodeNumber - 1] + 1) % 10;
答案 2 :(得分:4)
trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
是的,正如错误消息所说,这是未定义的行为。如果没有序列点,则不允许两次修改相同的值。在这种情况下,这意味着您不允许使用trackTail[nodeNumber-1]
增加++
并使用=
重新分配。
如果您只使用+ 1
代替++
,它就可以正常使用。