智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1450|回复: 4
打印 上一主题 下一主题

[软件类] 程序跑偏了,求解释.

[复制链接]

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
跳转到指定楼层
1#
发表于 2013-12-30 16:13:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5贡献
我要完成一个算法,自己写了两个函数来实现这个算法,第一个函数主要是创建链表来保存有用信息,第二个函数主要是完成对第一个函数创建的链表进行处理。开始时第一个函数也存在问题:发现是创建链表节点时动态申请内存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; //还没到尽头,向前更换参考点
          }
       }
   }   
}




50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
2#
 楼主| 发表于 2013-12-30 16:21:23 | 只看该作者
其中调用了删除节点函数:
//调用此函数必须保证被删除的节点不是链表头
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;
}
回复

使用道具 举报

1

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1247
威望
698
贡献
385
兑换币
359
注册时间
2012-7-18
在线时间
82 小时
3#
发表于 2013-12-30 16:22:51 | 只看该作者
何必弄得这么复杂呢
回复

使用道具 举报

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
4#
 楼主| 发表于 2013-12-30 16:23:38 | 只看该作者
我用 的IDE 是IAR 6.5
芯片是K60 512Flash 128ram
回复

使用道具 举报

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
5#
 楼主| 发表于 2013-12-30 17:23:57 | 只看该作者
wzp1992 发表于 2013-12-30 16:22
何必弄得这么复杂呢

额...不是飞思卡尔的!我自己的项目...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 17:33 , Processed in 0.043561 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表