我的循环中的一个函数以某种方式改变了我迭代的值,我不确定如何。如果描述得很糟,我很抱歉。
在这个for循环中
int k;
for( k = 0; k < 512; k++)
{
// Discardheader(d); // doesnt actually do anything, since it's a header.f
int databit = Getexpecteddata(d+4*k+1);
printf("%d ",k);
int transmitted = Datasample(&datastate, &datalength, d+4*k+2,dataerr,dataloc, databit);
printf("%d ",k);
Clocksample(&clockstate, &clocklength, d+4*k+3,clockerr, transmitted);
printf("%d \n",k);
}
我得到了这个输出
16 16 16
17 17 17
18 18 18
19 19 19
20 20 20
21 1 1
2 2 2
3 3 3
4 4 4
所以不知何故,Datasample一旦达到21就改变了k的值.d是char * d类型并且表示我读取文件的缓冲区。更改输入文件不会改变21,切换发生。这是数据示例的代码:
int Datasample (int* state, int* length, char *d, int *type, int location, int data)
{
int match = 1; // if data sample and delayed tx match,
if ( ((d[0] >> location) & 1) != data)
{
match = 0;
if(data)
{
type[2]++;
}
else
{
type[1]++;
}
}
int ia;
for( ia = 7; ia>=0; ia--)
{
if ( ((d[0] >> ia) & 1) == *state) // finds an edge
{
*length++;
}
else
{
int distance, deviation,devflag=1; // distance the edge is from the sample point. should be about 4
if ( location > 3) // deviation is how far the distance then is from 4
{distance = location - ia;}
else
{distance = ia - location;}
deviation = abs(4-distance);
if( (deviation >= devmax) && match && devflag)
{
devflag =0;
if(data)
{
type[2]++;
}
else
{
type[1]++;
}
}
*state = ((d[0] >> ia) & 1);
*length = 1;
}
}
return ((d[0] >> location) & 1);
}
什么导致k一旦达到21就回滚到1?
提前谢谢。我不知道我在做什么。答案 0 :(得分:5)
看看你的输出,Datasample
函数很可能会对内存做一些有趣的事情。
我看到的第一个问题是你传递一个整数作为函数的第三个参数,并且指向一个指针。这让我相信你在没有警告的情况下进行编译。这是真正的问题。
根据最近的评论,事实证明d
实际上是一个指针。但是,我坚持认为该函数中的某些内容会覆盖k
。
由于正在使用Linux上的gcc,您可以尝试valgrind
来快速查明问题。它应该警告你非法访问内存。
答案 1 :(得分:3)
使用调试器,例如Linux上的gdb
,并在k
上设置观察点;也许一些被调用的例程溢出了它的调用堆栈....
答案 2 :(得分:1)
我不知道程序应该做什么(评论没有多大帮助,变量名称不具有描述性)。主要问题似乎是*lenght++;
语句,这使得指针无法识别。随后的*length = 1;
可以完成肮脏的工作。
对样式的额外评论:最好对 unsigned 类型执行位操作;符号扩展可能导致'1'位出现在不需要的位置。另外:建议对计数器和索引使用无符号类型;这将导致程序在下溢时更严格地崩溃。
int Datasample (int *state, int *length, char *d, int *type, unsigned location, int data)
{
int match = 1; // if data sample and delayed tx match,
int devflag = 1; /* hoisted this variable from inner loop */
unsigned bitpos ; /* renamed and changed to unsigned ( location as well) */
/* Note: shift by zero (or negative) is undefined */
if ( ((d[0] >> location) & 1) != data) {
match = 0;
if(data) type[2]++;
else type[1]++;
}
/* Again: shift by zero is undefined */
for( bitpos = 8; bitpos-- > 0; )
{
// find an edge
if ( ((d[0] >> bitpos) & 1) == *state) *length += 1;
else
{
int distance, deviation;
// distance the edge is from the sample point. should be about 4
// deviation is how far the distance then is from 4
distance = (location > 3) ? location - bitpos : bitpos - location;
deviation = abs(4-distance);
if (deviation >= devmax && match && devflag)
{
devflag =0;
if (data) type[2]++;
else type[1]++;
}
*state = ((d[0] >> bitpos) & 1);
*length = 1;
}
}
return ((d[0] >> location) & 1);
}
BTW是0_patterns的预期输出?
File contains 5769 events
File contains 6938 errors
File contains 543 spill errors
File contains 6395 nonspill errors
Error nonspill # spill #
Type D 2250 451
Type C 0 0
Type B 4145 92
Case 1 1195 307
Case 2 0 20
Case 3 1055 124
Case 4 0 0
Case 5 0 0
Case 6 0 0
Case 7 0 0
Case 8 1160 9
Case 9 0 0
Case 10a 1472 39
Case 10b 1513 29
Case 10c 0 15
答案 3 :(得分:0)
您在何处以及如何声明dataerror?我的猜测是你在函数中修改数据错误然后溢出数据的大小,这可能会影响变量k。
答案 4 :(得分:0)
根据输出,显然你正在写入一些在k之前开始16个元素的数组。