声明两个不同的结构大小

时间:2016-03-23 18:26:33

标签: c struct typedef

这是在微控制器平台上,所以RAM的使用很重要。

我有一个很好的小库,我用它来循环缓冲区。对于循环缓冲区,我声明了一个struct typedef:

typedef struct buffer {
    uint8_t data[BUFFER_LENGTH];
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
} Buffer;

通常情况下,我只需要每个应用程序中的一个,因此将BUFFER_LENGTH定义为特定值并不是什么大问题,但我有一个应用程序需要其中两个...一个相对较短的长度(32字节)和一个相对较长的长度(256字节)。

我是否可以使用一种简单的技术,它不会涉及malloc(),这将允许我声明两个不同长度的两个变量?

到目前为止我唯一想到的是将结构中的数据作为指针,在声明缓冲区时声明数组,并将缓冲区长度添加到Buffer typedef:

typedef struct buffer {
    uint8_t dataPtr*;
    uint16_t length;
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
} Buffer;

uint8_t dataBuf1[256]
uint8_t dataBuf2[32]

Buffer buf1, buf2;

buf1.dataPtr = dataBuf1;
buf1.length = 256;

buf2.dataPtr = dataBuf2;
buf2.length = 32;

这会有效,但是有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

您可以定义两个结构:

#define LARGE_BUFFER_LENGTH   256
#define SMALL_BUFFER_LENGTH   32

typedef struct buffer {
    uint16_t buffer_size;
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    uint8_t data[LARGE_BUFFER_LENGTH];
} Large_Buffer;

typedef struct buffer {
    uint16_t buffer_size;
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    uint8_t data[SMALL_BUFFER_LENGTH];
} Small_Buffer;

data成员移至最后,并添加buffer_size成员。您应该能够共享处理程序函数,方法是将指针强制转换为较小的类型,以使编译器可以接受。如果您显然溢出数组,C并不关心,buffer_size字段将处理实现差异。无论您以前使用buffer_size,都可以使用BUFFER_LENGTH(当然已初步化)。

答案 1 :(得分:1)

如果您不想动态分配,可以使用如下定义:

typedef struct buffer {
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    int length;
    uint8_t data[];
} Buffer;

然后是两个兼容的定义类型:

typedef struct buffer1 {
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    int length;
    uint8_t data[LENGHT1];
} Buffer1_t;

typedef struct buffer2 {
    uint16_t newest_index;
    uint16_t oldest_index;
    BufferStatus status;
    int length; // may be useful...
    uint8_t data[LENGHT2];
} Buffer2_t;

然后你可以使用指针来玩:

Buffer *allocate_buffer(int type) {
    if (type==1) {
      return (Buffer *)malloc(sizeof(Buffer1_t));
    } else ...
}    

如果您不想进行动态分配,您可以使用静态预先分配的此类结构。