【问题标题】:Declare arrays with different sizes in a C typedef struct在 C typedef 结构中声明具有不同大小的数组
【发布时间】:2018-11-15 09:03:46
【问题描述】:

我知道如何使用malloc 动态分配一个新数组。 我想知道在这种情况下是否有办法避免这种情况:

#define RX_BUFFER_SIZE    256
#define TX_BUFFER_SIZE    128

typedef struct MyBuffer 
{
    volatile uint8_t RX[RX_BUFFER_SIZE];
    volatile uint8_t TX[TX_BUFFER_SIZE];
    volatile uint16_t RX_Head;
    volatile uint16_t RX_Tail;
    volatile uint16_t TX_Head;
    volatile uint16_t TX_Tail;
} MyBuffer_t;

typedef struct MyChannel
{
    // other stuff
    MyBuffer_t buffer;
} MyChannel_t;

然后在我的代码中创建几个这样的变量:

MyChannel_t ch1;
MyChannel_t ch2;
MyChannel_t ch3;

但我想为每个变量设置不同大小的数组。可以在一小部分中进行选择,即:

#define RX_BUFFER_SIZE_S    32
#define TX_BUFFER_SIZE_S    16

#define RX_BUFFER_SIZE_M    128
#define TX_BUFFER_SIZE_M    64

#define RX_BUFFER_SIZE_L    256
#define TX_BUFFER_SIZE_L    128

有没有办法使用malloc 实现这个

【问题讨论】:

  • 如果您要在每个源文件中声明大小,然后包含 typedef,那么您可以。
  • 我想为每个声明的MyChannel_t 设置大小。
  • 你可以,如果你按照我的建议在不同的源文件中声明它们。否则是不可能的。
  • 旁注:您的MyBuffer_t 实际上应该命名为My2Buffers_t。我建议在结构中只使用单个缓冲区、头部和尾部,然后创建相同类型的不同 RX 和 TX 实例。

标签: c arrays struct typedef


【解决方案1】:

将缓冲区声明为指针:

typedef struct MyBuffer 
{
    volatile uint8_t * RX;
    volatile uint8_t * TX;
    size_t rxSize;
    size_t txSize;
    volatile uint16_t RX_Head;
   ...

然后对缓冲区使用单独的静态分配,并使用它们来初始化您的对象。

volatile uint8_t ch1_rx_buffer[RX_BUFFER_SIZE_S];
volatile uint8_t ch1_tx_buffer[TX_BUFFER_SIZE_S];
MyChannel_t ch1 = { 
    .buffer = {
        ch1_rx_buffer, 
        ch1_tx_buffer, 
        sizeof ch1_rx_buffer, 
        sizeof ch1_tx_buffer,
         ... 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多