【问题标题】:How to iterate thorough all items in a structure?如何遍历结构中的所有项目?
【发布时间】:2012-06-14 15:32:43
【问题描述】:

我有例如这种格式的结构

typedef struct{
  tMY_STRUCT2 my_struct2;
  u16 item1;
  u8 item2[20];      
  u32 item3;
}tMY_STRUCT;

我怎样才能通过结构? 因为 alignment 它并不容易,我不能只计算从 SIZEOF(item) 开始的结构的偏移量。

有什么办法吗?

原因:我需要启动大型结构,有一些条件,所以我需要在一个FOR循环内完成。

【问题讨论】:

标签: c struct structure


【解决方案1】:

不要这样做。结构的要点是您无法统一处理其数据项。结构之于异构数据,就像数组之于同质。

在代码中一次一个地初始化每个字段,或者将整个结构初始化为零。这些是唯一的良好实践选择。尤其是对齐将取决于机器架构、编译器等,因此如果您对代码进行看似微不足道的更改,例如重新排序声明中的字段,或者在不同的操作系统上运行或在其他地方编译,那么使用它的方法可能会中断.

选项:

memset(mystruct, 0, sizeof(mystruct));

或(我认为这是 C99)mystruct_t foo = {0};

或者只是初始化每个字段。

【讨论】:

  • 所有结构的 Memset 对我来说不够好,因为我说过我的 Init 比那个解决方案更难。在我的情况下,定义了特殊数组中每个项目的长度(对齐前)。所以我必须创建函数将这个结构序列化为字节数组,然后在我的初始化周期中使用这个数组。
  • 550 项,为每个现场测试一些条件而不是初始化?
  • 为什么一个结构中有 550 个项目?你确定你不应该使用数组吗?
  • 事实上,我什至会说 - 如果您可以以任何统一的方式初始化这些,无需对每个都执行不同的逻辑项,那么您可以并且应该通过数组的定义属性来使用数组。
  • 有很多级别。使用数组很难遵循这个级别。您必须使用一些偏移量等。下一个优点是我可以定义一次小结构并在大结构中多次使用它。
【解决方案2】:

我不太明白 for 循环如何在这里为您提供帮助...但是没有很好的方法来遍历结构。

您可以设置一个指向结构中对象的指针结构,然后通过 sizeof(ptr) 跳过该结构,但这太可怕了,您的同事会私刑处死您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多