LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 572|回复: 6

从一个BUFFER里取特定特定行的代码,请帮忙DEBUG!急!

[复制链接]
发表于 2004-7-23 08:09:19 | 显示全部楼层 |阅读模式
从大小为size的data里面取出第linenum行的字符串,然后放到target里面去。
行数少的data还行,行数一多就乱七八糟了,能不能帮忙Debug一下?或者帮忙写个有同样功能的CODE出来也行。

  1. int gMotionDefGetLine(byte* data, size_t size, int linenum, byte* target){
  2.         size_t pos, buf_pos = 0;
  3.         int lineCount = 0;

  4.         byte buf[MAX_LINE_SIZE];
  5.         memset(buf, 0, MAX_LINE_SIZE);
  6.        
  7.         for (pos = 0; pos < size; pos++){
  8.                 if (data[pos] == '\n'){
  9.                         if (lineCount == linenum){
  10.                                 memcpy(target, buf, buf_pos);
  11.                                 target[buf_pos] = 0;
  12.                                 return buf_pos;
  13.                         }
  14.                         lineCount++;
  15.                         pos++;
  16.                         buf_pos = 0;
  17.                         memset(buf, 0, MAX_LINE_SIZE);
  18.                 }
  19.                 buf[buf_pos] = data[pos];
  20.                 buf_pos++;

  21.                 if (buf_pos > MAX_LINE_SIZE)
  22.                         return -1;
  23.         }
  24.         return -1;
  25. }
复制代码


下面是让这段代码出错的data:

  1. 4
  2. 3
  3. 8
  4. 6
  5. -0.999984 0.000000 25.000060 -10.000013 0.000000 30.000153 0.000000 0.000000 25.000118
  6. -25.000060 0.000000 110.000312 -80.000216 0.000000 145.000442 -25.000060 0.000000 110.000312 -80.000216 0.000000 145.000442
  7. -25.000060 0.000000 110.000312 -80.000216 0.000000 145.000442 -25.000060 0.000000 110.000312 -80.000216 0.000000 145.000442
  8. 25.000060 0.000000 60.000191 -105.000334 0.999984 147.000468 25.000060 0.000000 60.000191 -105.000334 0.999984 147.000468
  9. 25.000060 0.000000 60.000191 -105.000334 0.999984 147.000468 25.000060 0.000000 60.000191 -105.000334 0.999984 147.000468
  10. 0.000000 0.000000 9.999955 -90.000115 0.000000 135.000201 -0.599945 0.000000 10.600072 -90.000344 0.000000 135.000716
  11. 0.000000 0.000000 9.999955 -90.000115 0.000000 135.000201 -0.599945 0.000000 10.600072 -90.000344 0.000000 135.000716
  12. 0.000000 0.000000 9.999955 -90.000115 0.000000 135.000201 -0.599945 0.000000 10.600072 -90.000344 0.000000 135.000716
复制代码


谢谢了!
 楼主| 发表于 2004-7-23 08:11:53 | 显示全部楼层
因为是给嵌入系统用的,不能用<string.h>,只能用<stdlib.h>和<stdio.h>
发表于 2004-7-23 08:47:25 | 显示全部楼层
能不能帮忙Debug一下?或者帮忙写个有同样功能的CODE出来也行。

如果是想让我们给你写代码或者做测试,出个价吧。
发表于 2004-7-23 08:57:48 | 显示全部楼层
这几行有点问题吧(当遇到'\n'并且lineCount != linenum时)
lineCount++;
pos++;
buf_pos = 0;
memset(buf, 0, MAX_LINE_SIZE);
这时后面的内容不需要做了,应该continue,于是pos++会自动执行
不需要自己再写一个pos++,所以我认为应该改成
lineCount++;
buf_pos = 0;
memset(buf, 0, MAX_LINE_SIZE);
continue;

另外,不管这一行要不要,你都做了buf[buf_pos] = data[pos];
这也太浪费资源了吧,只需要把位置记下来,到了需要的那一行
来个memcpy就行了
发表于 2004-7-23 08:58:58 | 显示全部楼层
呵呵, kj501版主言之有理
发表于 2004-7-23 10:24:22 | 显示全部楼层
人家贴出来了一段代码,自己写个驱动程序,不是也可以锻炼自己的调试技术?(比要钱,要值吧,我知道版主说的是笑话,呵呵。)

应该是有缓冲区溢出的问题。你用的那个常量MAX_LINE_SIZE是多少呢?是一个定值吧。很危险喔。代码的结构也还清晰,可以从下面的测试数据中,可以看出后面的行很长唉。

而且,代码里并没有输入数据行的长度。
 楼主| 发表于 2004-7-23 13:33:33 | 显示全部楼层
stoner==swkcl猜对了,就是缓冲区问题。这段代码没有问题,而是我另外的地方定义MAX_LINE_SIZE重复了。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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