白姐透特今晚开什么码

打印

预处理实现自动判断长度?

[复制链接]
1119|25
跳转到指定楼层
楼主
本帖最后由 457878 于 2019-12-20 13:51 编辑

rensas的16位mcu,结构体会16位对齐,所以带来个结构体长度判断的麻烦(copy到目标数组后的长度有可能-1),能不能用预处理搞定呢?


  1. #define DEF_STRUCT_LEN(structName,structLen)                        \
  2. {                                                                                                                \
  3.         #if ((sizeof(structName)%2) == 0)                                        \
  4.                 #define structLen         ((sizeof(structName)-0)*2)        \
  5.         #else                                                                                                \
  6.                 #define structLen         ((sizeof(structName)-1)*2)        \
  7.         #endif                                                                                                \
  8. }
  9. typedef struct
  10. {        UINT16         type;
  11.         UINT16         len;
  12.         char         val[14];
  13.         // char        dumy;
  14. }T_TLV_NBVer;

  15. DEF_STRUCT_LEN(T_TLV_NBVer,LEN_TLV_NBVER)
复制代码




相关资料

沙发
|2019-12-20 13:15|只看该作者
直接写个函数就好啊,然后动态申请结构体的空间就可以。不懂楼主为什么想着用预处理

评论

@若水2019-12-21 20:34回复TA
单片机也动态申请啊? 
板凳
 楼主|2019-12-20 13:39|只看该作者
本帖最后由 457878 于 2019-12-20 13:46 编辑
dirtwillfly 发表于 2019-12-20 13:15
直接写个函数就好啊,然后动态申请结构体的空间就可以。不懂楼主为什么想着用预处理 ...

好多结构体,好多种数据结构,不然搞这个干嘛...
上传Keil 环境测试文件(编译失败),方便调试

testPreBuild.rar

12.37 KB, 下载次数: 2

地板
|2019-12-20 13:51|只看该作者
457878 发表于 2019-12-20 13:39
好多结构体,好多种数据结构,不然搞这个干嘛...
上传Keil 环境测试文件(编译失败),方便调试

我弄104规约,也是好多结构体和数据结构,用的动态申请内存空间和释放。不过处理器我用的stm32,现在运行没啥问题。
5
|2019-12-20 13:53|只看该作者

6
 楼主|2019-12-20 14:08|只看该作者
dirtwillfly 发表于 2019-12-20 13:51
我弄104规约,也是好多结构体和数据结构,用的动态申请内存空间和释放。不过处理器我用的stm32,现在运行 ...

大神...玩104规约...
个人认为,动态分配内存非常危险...

7
 楼主|2019-12-20 14:27|只看该作者
另外,你这个动态分配,修改方便程度也不不好,来看看我怎么写的:


8
|2019-12-20 15:01|只看该作者
457878 发表于 2019-12-20 14:08
大神...玩104规约...
个人认为,动态分配内存非常危险...

还好吧,只要注意按需要申请和释放内存,没有多大问题的

评论

dirtwillfly2019-12-22 12:03回复TA
@@若水 :如果稳定不下来,就需要自己写相应的内存碎片管理方法了。 
dirtwillfly2019-12-22 11:57回复TA
@@若水 :还好,我的应用经过测试,使用的最大堆空间会稳定下来。 
@若水2019-12-21 20:35回复TA
内存碎片怎么处理? 
9
|2019-12-20 15:47|只看该作者
GCC 有字节对齐的特殊指令。
  struct stu{
   char sex;
   int length;
   char name[10];
  }__attribute__ ((aligned (1)));
__attribute__ ((aligned (1))); 这个就是搞对齐的。我记得以前x86也是可以字节对齐的。
你查查瑞萨的c编译手册,看看有没有。
10
|2019-12-20 15:58|只看该作者

看了下手册,好像瑞萨也有这个指令。
11
|2019-12-20 16:11|只看该作者

手册上举的例子
12
 楼主|2019-12-20 16:20|只看该作者
本帖最后由 457878 于 2019-12-20 16:35 编辑
叶春勇 发表于 2019-12-20 15:58
看了下手册,好像瑞萨也有这个指令。

哪里下载的,共享一个呗,瑞萨资料不好找,特别是中文资料
实际情况是:地址会跳跃如图,然后用sizeof取到的全部是双数...

13
|2019-12-20 16:37|只看该作者
我在网上胡乱搜的。希望对你有用。

瑞萨编译器手册.pdf

白姐透特今晚开什么码3.4 MB, 下载次数: 1

14
|2019-12-20 16:49|只看该作者
本帖最后由 叶春勇 于 2019-12-20 16:55 编辑
457878 发表于 2019-12-20 16:20
哪里下载的,共享一个呗,瑞萨资料不好找,特别是中文资料
实际情况是:地址会跳跃如图,然后用sizeof取到 ...

你这个好像是结构体中含有结构体。是不是每个结构定义都要用。
你这个涉及到,结构体内成员的对齐,还有结构体与结构体之间的对齐。
15
 楼主|2019-12-20 17:15|只看该作者
本帖最后由 457878 于 2019-12-20 17:17 编辑
叶春勇 发表于 2019-12-20 16:49
你这个好像是结构体中含有结构体。是不是每个结构定义都要用。
你这个涉及到,结构体内成员的对齐,还有结 ...

结构体内也是乱套的,这个是最顶层结构体:



16
|2019-12-20 20:00|只看该作者
457878 发表于 2019-12-20 17:15
结构体内也是乱套的,这个是最顶层结构体:

编译指令,用了吗。贴出来看看
17
 楼主|2019-12-21 13:27|只看该作者
本帖最后由 457878 于 2019-12-21 13:29 编辑
叶春勇 发表于 2019-12-20 20:00
编译指令,用了吗。贴出来看看
没用编译指令:

test.rar(39.94 KB, 下载次数: 2)


18
|2019-12-21 13:47|只看该作者

state2 x10ms调换位置呢?
19
 楼主|2019-12-21 15:22|只看该作者
本帖最后由 457878 于 2019-12-21 15:33 编辑
叶春勇 发表于 2019-12-21 13:47
state2 x10ms调换位置呢?

实际应用中state2是没有的...搞上去是强调这个乱套 :)
暂行方案:
1.用“目测”的方法,手动定义长度,
2.然后在转换的时候使用手动定义的长度



20
|2019-12-21 16:30|只看该作者
457878 发表于 2019-12-21 15:22
实际应用中state2是没有的...搞上去是强调这个乱套 :)
暂行方案:
1.用“目测”的方法,手动定义长度,
  1. #include<stdio.h>
  2. #include<stdint.h>

  3. #pragma pack (1)
  4. typedef struct
  5. {
  6.         uint16_t x10ms;
  7.         uint8_t state;        //2 bytes used
  8. }stru1_typedef;

  9. typedef struct
  10. {
  11.         uint8_t state;
  12.         uint16_t x10ms;
  13.         uint8_t state2;        //2 bytes used
  14. } stru2_typedef ;

  15. typedef struct
  16. {
  17.         uint16_t x10ms;
  18.         uint8_t state;
  19.         uint8_t state2;        //2 bytes used
  20. } stru3_typedef ;

  21. stru1_typedef a[10];
  22. stru2_typedef b[10];
  23. stru3_typedef c[10];

  24. int main(void)
  25. {
  26.         uint8_t *p;
  27.         printf("%d,%d\n",(uint8_t*)&a[1]-(uint8_t*)&a[0],sizeof(stru1_typedef));
  28.         printf("%d,%d\n",(uint8_t*)&b[1]-(uint8_t*)&b[0],sizeof(stru2_typedef));
  29.         printf("%d,%d\n",(uint8_t*)&c[1]-(uint8_t*)&c[0],sizeof(stru3_typedef));
  30.         a[0].state=0xa5;
  31.         b[0].state2=0xa5;
  32.         c[0].state=0xa5;
  33.        
  34.         p=(uint8_t *)&a[0];
  35.         printf("%d\n",p[2]);
  36.         p=(uint8_t *)&b[0];
  37.         printf("%d\n",p[3]);
  38.         p=(uint8_t *)&c[0];
  39.         printf("%d\n",p[2]);
  40.        
  41. }
复制代码

编译指令有用的。
扫描二维码,随时随地手机跟帖

本版积分规则

我要发帖投诉建议创建版块

快速回复

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

论坛热帖

关闭

热门推荐上一条 /6 下一条

在线客服 快速回复 返回顶部返回列表