免费注册 查看新帖 |

Chinaunix

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

如果__attribute__ ((packed))沒有作用,要檢查那些設定? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-26 13:34 |只看该作者 |倒序浏览
本帖最后由 aderho 于 2010-11-30 16:08 编辑

如果__attribute__ ((packed))沒有作用,要檢查那些設定?

各位好:
下列程式
#include <stdio.h>
#include <stdlib.h>

struct SS2
{ char On;
  float FV;  
}__attribute__ ((packed)) FS[10];

void modify(float *p)
{ static float fv=1.5;
  *p = fv;
  fv++;
}

int main(void)
{ short i;
  for(i=0;i<10;i++)
  { modify(&FS[ i ].FV);
    printf("%02d->%05.2f\n",i,FS[ i ].FV);
  }  
  return 0;
}
原本希望出現
/home # ./scale
00->01.50
01->02.50
02->03.50
03->04.50
04->05.50
05->06.50
06->07.50
07->08.50
08->09.50
09->10.50
結果出現是
00->00.00
01->00.00
02->00.00
03->04.50
04->00.00
05->00.00
06->00.00
07->08.50
08->00.00
09->00.00
顯然__attribute__ ((packed))沒有作用
參數如此下
root@aderho:/home/work/scale# make
/opt/toolchains/arm920t-eabi/bin/arm-linux-g++ -fsigned-char  -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/mkspecs/qws/linux-arm-g++ -I. -I/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/include/QtCore -I/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/include/QtNetwork -I/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/include/QtGui -I/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/include -I. -I. -I. -o main.o main.cpp
/opt/toolchains/arm920t-eabi/bin/arm-linux-g++ -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/lib -o scale main.o    -L/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/lib -lQtGui -L/opt/tslib/arm/o/lib -L/usr/local/Trolltech/QtEmbedded-4.5.0/arm/o/lib -lts -lQtNetwork -lQtCore -lz -lm -lrt -ldl -lpthread
有勞各位提供一點建議!

感謝!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-11-26 13:47 |只看该作者
用代码方式贴,你确定是

modify(&FS.FV);
printf("%02d->%05.2f\n",i,FS.FV);

这样的么?

论坛徽章:
0
3 [报告]
发表于 2010-11-26 13:56 |只看该作者
大好人您好:
是的!
另外如何用代码方式贴

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2010-11-26 14:16 |只看该作者
点上面的 “<>”按钮,代码放中间
  1. modify(&FS[i].FV);
  2. printf("%02d->%05.2f\n",i,FS[i].FV);
复制代码
这样才对吧,像前面那样的能编译过?

觉得跟packed没有关系

论坛徽章:
0
5 [报告]
发表于 2010-11-26 14:28 |只看该作者
本帖最后由 aderho 于 2010-11-29 17:04 编辑

再貼一次代碼
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct SS2
  4. { char On;
  5.   float FV;  
  6. }__attribute__ ((packed)) FS[10];

  7. void modify(float *p)
  8. { static float fv=1.5;
  9.   *p = fv;
  10.   fv++;
  11. }

  12. int main(void)
  13. { short i;
  14.   for(i=0;i<10;i++)
  15.   { modify(&FS[i].FV);
  16.     printf("%02d->%05.2f\n",i,FS[i].FV);
  17.   }  
  18.   return 0;
  19. }
复制代码
因為可以編繹過,看到結果不如預期,希望各位能指點迷津!

论坛徽章:
0
6 [报告]
发表于 2010-11-27 00:29 |只看该作者
18      modify(&FS[i].FV);
19     printf("%02d->%05.2f\n",i,FS[i].FV);

楼主 要改成这样,要不编译都不过,然后结果ok

论坛徽章:
0
7 [报告]
发表于 2010-11-28 11:09 |只看该作者
说的一点都没错,packed怎么可能会起作用呢???
ARM只能4字节对齐,packed是没有用的。这是ARM的结构导致的,你放到x86平台试试,就正常了。

论坛徽章:
0
8 [报告]
发表于 2010-11-29 16:45 |只看该作者
本帖最后由 aderho 于 2010-11-29 17:09 编辑

>>说的一点都没错,packed怎么可能会起作用呢???
>>ARM只能4字节对齐,packed是没有用的。这是ARM的结构导致的,你放到x86平台试试,就正常了而。
是不是arm的结构無法以byte處理.
在arm就異常在x86的確是正常的,有沒有換代方案.
6樓,原程式是有 [ i ] , 已改過了.

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
9 [报告]
发表于 2010-11-29 21:18 |只看该作者
本帖最后由 yulihua49 于 2010-11-29 21:25 编辑
如果__attribute__ ((packed))沒有作用,要檢查那些設定?

各位好:
下列程式
#include
#include

s ...
aderho 发表于 2010-11-26 13:34



    不要滥用__attribute__ ((packed)),对于许多CPU,边界不齐的单元使用时程序直接就飞了。
如果一定要用,其中的内容不能直接使用。例如int型,你要写两个函数:
int ldint(char *intp) //从不对齐的存储区读出int类型,逐字节取出按LSB或MSB的机器顺序到int变量
stint(char *intp,int) //把int变量逐字节放到不对齐的存储区(通常要改成网络序)

论坛徽章:
0
10 [报告]
发表于 2010-11-30 16:01 |只看该作者
本帖最后由 aderho 于 2010-11-30 16:38 编辑

有一篇處理的方式
http://www.linuxforum.net/forum/ ... d&Number=535938

http://topic.csdn.net/u/20090302 ... a-4d17d7754dd5.html

整理可以的方式!
1.改用结构指针
2.變數或结构內容全部以4的倍數(long,float)
3.如同9樓的建議,自己寫個轉換函數(針對非4的倍數的變數)

...有賴大家再提供建議啦!

以下是採用结构指针
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct SS2
  4. { char On;
  5.   float FV;  
  6. }__attribute__ ((packed)) FS[10];

  7. void modify(struct SS2 *sp)
  8. { static float fv=1.5;
  9.   sp->FV = fv; fv++;
  10. }

  11. int main(void)
  12. { short i; char *cp,m0,m1,m2,m3,m4;
  13.   for(i=0;i<10;i++)
  14.   { modify((struct SS2 *)&FS[i]); FS[i].On=i; cp=(char *)&FS[i]; m0=*cp; cp++; m1=*cp; cp++; m2=*cp; cp++; m3=*cp; cp++; m4=*cp;
  15.     printf("%02d->%05.2f : %02x, %02x,%02x,%02x,%02x\n",i,FS[i].FV,(unsigned char)m0,(unsigned char)m1,(unsigned char)m2,(unsigned char)m3,(unsigned char)m4);   
  16.   }  
  17.   return 0;
  18. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP