免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2985 | 回复: 6
打印 上一主题 下一主题

[C] 帮看看这个C程序我在X86下编译能运行 但在ARM编译下面就不行 为什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-01 15:12 |只看该作者 |倒序浏览
  1. #include <termios.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <dirent.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <time.h>

  9. FILE * f1;
  10. char *name;
  11. char c;
  12. int i;
  13. int n=0;
  14. int key;
  15. int result[32];

  16. int hex2dec (char *c)
  17. {
  18.   int l,h;
  19.   int ans;

  20.   l = *c & 0xf;
  21.   h = (*c >> 4) & 0xf;
  22.   ans = h*16 + l;
  23. //printf ("%d\n", ans);
  24.   return (ans);
  25. }

  26. int main(int argc, char *argv[])
  27. {
  28.   int sum=0;
  29.   int total=0;
  30.   int n=0;
  31.   char ans[2];

  32.   if ( argc != 3 )
  33.      printf ("b2d [0:LE;1=BE] [file]\n");
  34.   else {
  35.    key  = atoi(argv[1]);
  36.    name = argv[2];
  37.    f1 = fopen (name, "rw");
  38.    if ( f1 == NULL)
  39.       printf ("File Open Error!\n");
  40.    else {
  41.       do {
  42.         c = fgetc (f1);
  43.         if (( c != EOF ) || ( n == 0)) result[n++]=c;
  44.         //result[n++]=c;
  45.       } while ( c != EOF );

  46.       if ( key == 0 )
  47.       {
  48.        //litter eiden  
  49.          for (i=0; i<n; i++) {
  50.             c=result[i] & 0xff;
  51.             sum=hex2dec(&c);
  52.             total=(total*256)+sum;
  53.          }
  54.       } else
  55.        //big eiden  
  56.          for (i=n-1; i>=0; i--) {
  57.             c=result[i] & 0xff;
  58.             sum=hex2dec(&c);
  59.             total=(total*256)+sum;
  60.          }
  61.       }
  62.    }
  63.    printf ("%d", total);
  64.    fclose (f1);
  65. }  //end of main
复制代码
提示 segmentation fault 有人帮解决一下??

论坛徽章:
0
2 [报告]
发表于 2011-07-01 15:34 |只看该作者
没仔细看,但感觉是非对齐访问导致的吧。X86下容许非对齐访问,ARM下就会报错。

论坛徽章:
0
3 [报告]
发表于 2011-07-01 15:48 |只看该作者
网上查了下 需要用__packed来定义指针?? 能帮改一下么 楼上大神

论坛徽章:
0
4 [报告]
发表于 2011-07-01 16:10 |只看该作者
我看了下 好像是在 c = fgetc (f1);
读最后一位的时候输出中断的

论坛徽章:
0
5 [报告]
发表于 2011-07-01 16:32 |只看该作者
调试一下哪里断了

论坛徽章:
0
6 [报告]
发表于 2011-07-01 16:33 |只看该作者
我找到了把char c; 改成int c; 就好了估计ARM下面编译太严格了 X86 下没问题

论坛徽章:
0
7 [报告]
发表于 2011-07-02 01:04 |只看该作者
c = fgetc (f1);

        if (( c != EOF ) || ( n == 0)) result[n++]=c;

        //result[n++]=c;

      } while ( c != EOF );

问题在这里。在arm下,char 默认为unsigned char,而fgetc返回值为int型,EOF是-1,故c!=EOF永远成立。
x86下,char为signed char,c!=EOF在结束时会不成立而结束循环。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP