智能车制作
标题:
程序跑偏了,求解释.
[打印本页]
作者:
尕玍紿
时间:
2013-12-30 16:13
标题:
程序跑偏了,求解释.
我要完成一个算法,自己写了两个函数来实现这个算法,第一个函数主要是创建链表来保存有用信息,第二个函数主要是完成对第一个函数创建的链表进行处理。开始时第一个函数也存在问题:发现是创建链表节点时动态申请内存malloc()函数造成的,原因是heap不足,导致malloc失败。自己忽略了heap不足的处理,导致了程序跑偏。现在已经在.icf文件中把heap的大小设置大了,且调用第一个函数不会跑偏了,可是现在一加上第二个函数就跑偏,注释掉就不会,所以可以肯定问题出现在了第二个函数。
第二个函数中主要涉及到对第一个函数创建的双向结构体链表的操作(遍历整条链,if节点满足条件就delete掉,不成立不操作)。
第二个函数实现如下:查了M遍了,感觉不是自己函数的漏洞问题,猜测与heap或Cstack有关,但是对这方面一点都不懂。求有思路的讲解讲解。
//调用此函数必须保证白点个数大于1,即2或2个以上
void compressLightDotByY(void)
{
int i;
int lengthTemp;
WhiteDotNode *compareNode = NULL;
WhiteDotNode *referencedNode = NULL;
compareNode = allWhiteDotList.head->next;
lengthTemp = allWhiteDotList.length;
for(i=1;i<lengthTemp;i++)
{
referencedNode = compareNode->prev; //重置参考点为比较点的前一点
while(1)
{
if((abs(compareNode->x - referencedNode->x) <= DIAMETER_X)&&((compareNode->y - referencedNode->y)<= DIAMETER_Y)) //该节点满足与前面的的节点相邻则删除
{
if(compareNode->next != NULL){ //非链尾
compareNode = compareNode->next;//更换比较点
deleteNode(compareNode->prev);
break;
}else{ //链尾
deleteNode(compareNode);
break;
}
}
else if(referencedNode->prev==NULL)//比到尽头了
{
compareNode = compareNode->next; //更换 比较点
break;
}else{
referencedNode = referencedNode->prev; //还没到尽头,向前更换参考点
}
}
}
}
作者:
尕玍紿
时间:
2013-12-30 16:21
其中调用了删除节点函数:
//调用此函数必须保证被删除的节点不是链表头
void deleteNode(WhiteDotNode *whiteDotNode)
{
if(whiteDotNode->next != NULL)//非链尾节点
{
whiteDotNode->prev->next = whiteDotNode->next;
whiteDotNode->next->prev = whiteDotNode->prev;
}
else //链尾节点
{
whiteDotNode->prev->next = NULL;
}
free(whiteDotNode);
whiteDotNode = NULL;
}
作者:
wzp1992
时间:
2013-12-30 16:22
何必弄得这么复杂呢
作者:
尕玍紿
时间:
2013-12-30 16:23
我用 的IDE 是IAR 6.5
芯片是K60 512Flash 128ram
作者:
尕玍紿
时间:
2013-12-30 17:23
wzp1992 发表于 2013-12-30 16:22
何必弄得这么复杂呢
额...不是飞思卡尔的!我自己的项目...
欢迎光临 智能车制作 (http://www.znczz.com/)
Powered by Discuz! X3.2