声明两个不同的结构大小
Declare two different struct sizes
这是在微控制器平台上,因此 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()
允许我声明两个不同长度的两个变量?
到目前为止我唯一的想法是将结构中的数据设为指针,在声明缓冲区时声明数组,并将缓冲区长度添加到缓冲区类型定义中:
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;
这可行,但有更好的解决方案吗?
您可以像这样定义两个结构:
#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_LENGTH
.
的任何地方使用 buffer_size
(当然已初始化)
如果您不想动态分配,您可以使用如下定义:
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 ...
}
如果您不想要动态分配,您可以使用静态预分配的此类结构。
这是在微控制器平台上,因此 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()
允许我声明两个不同长度的两个变量?
到目前为止我唯一的想法是将结构中的数据设为指针,在声明缓冲区时声明数组,并将缓冲区长度添加到缓冲区类型定义中:
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;
这可行,但有更好的解决方案吗?
您可以像这样定义两个结构:
#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_LENGTH
.
buffer_size
(当然已初始化)
如果您不想动态分配,您可以使用如下定义:
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 ...
}
如果您不想要动态分配,您可以使用静态预分配的此类结构。