【问题标题】:Wrong assignment to struct对结构的错误分配
【发布时间】:2021-03-18 20:24:24
【问题描述】:

我有这样的结构:

typedef struct ws2811_channel_t
{
    int gpionum;                                 //< GPIO Pin with PWM alternate function, 0 if unused
    int invert;                                  //< Invert output signal
    int count;                                   //< Number of LEDs, 0 if channel is unused
    int strip_type;                              //< Strip color layout -- one of WS2811_STRIP_xxx constants
    ws2811_led_t *leds;                          //< LED buffers, allocated by driver based on count
    uint8_t brightness;                          //< Brightness value between 0 and 255
    uint8_t wshift;                              //< White shift value
    uint8_t rshift;                              //< Red shift value
    uint8_t gshift;                              //< Green shift value
    uint8_t bshift;                              //< Blue shift value
    uint8_t *gamma;                              //< Gamma correction table
} ws2811_channel_t;

typedef struct ws2811_t
{
    uint64_t render_wait_time;                   //< time in µs before the next render can run
    struct ws2811_device *device;                //< Private data for driver use
    const rpi_hw_t *rpi_hw;                      //< RPI Hardware Information
    uint32_t freq;                               //< Required output frequency
    int dmanum;                                  //< DMA number _not_ already in use
    ws2811_channel_t channel[RPI_PWM_CHANNELS];
} ws2811_t;

还有我的工作示例:

ws2811_channel_t channel = {
        .gpionum = LED_PIN,
        .invert = LED_INVERT,
        .count = LED_COUNT,
        .strip_type = WS2811_STRIP_RGB,
        .brightness = LED_BRIGHTNESS,

    };
    ws2811_t test = {
        .freq = LED_FREQ_HZ,
        .dmanum = LED_DMA,
        channel,
    };
    LOG_INFO("LEDController: Init - " << ws2811_get_return_t_str(ws2811_init(&test)));
    for (int i = 0; i < LED_COUNT; i++)
    {
        test.channel[0].leds[i] = (0 << 16) | (0 << 8) | 0;
    
    }
    ws2811_render(&test);

我想在课堂上正确分配私有财产,所以当我这样声明时:

ws2811_channel_t channel;
channel.gpionum = LED_PIN;
channel.invert = LED_INVERT;
channel.count = LED_COUNT;
channel.strip_type = WS2811_STRIP_RGB;
channel.brightness = LED_BRIGHTNESS;
ws2811_t test;
test.freq = LED_FREQ_HZ;
test.dmanum = LED_DMA;
test.channel[0] = channel;

    LOG_INFO("LEDController: Init - " << ws2811_get_return_t_str(ws2811_init(&test)));
    for (int i = 0; i < LED_COUNT; i++)
    {
        test.channel[0].leds[i] = (0 << 16) | (0 << 8) | 0;
    
    }
ws2811_render(&test);

ws2811_render(&amp;test); 挂起并冻结,在某些时候我得到了指向该方法的错误。 我假设这是因为它以某种方式有错误的分配。但为什么呢?

渲染的定义是

ws2811_return_t  ws2811_render(ws2811_t *ws2811)

从这里:https://github.com/jgarff/rpi_ws281x/blob/master/ws2811.c#L1138

我做错了什么?

【问题讨论】:

  • ws2811_render(&amp;test); 错误可能是 &。另外,您现在有支持新的 c++20 ws2811_channel_t channel = { .gpionum = LED_PIN, 的 c++ 编译器吗? https://en.cppreference.com/w/cpp/language/aggregate_initialization#Designated_initializers
  • 请添加ws2811_render的定义。
  • @drescherjm C 支持该语法。 OP 可能正在使用支持它作为扩展的 C++ 编译器。
  • 但是你没有在第二个代码中将它们归零,我可以看到。您认为这是在哪里进行的?
  • 在您的第二个示例中,尝试ws2811_channel_t channel{};ws2811_t test{}; - 例如添加{}

标签: c++ struct variable-assignment


【解决方案1】:

在您的第二个示例中,尝试 ws2811_channel_t channel{};ws2811_t test{}; - 例如添加{}

如果你这样做,那么你将初始化所有成员。您的第一个(工作)版本和第二个(损坏的)版本之间的主要区别在于,第一个版本会将 gamma 之类的东西归零,而第二个版本不会。添加{} 将在覆盖所需项目之前将所有内容归零。

如果您执行type a = {...},那么... 中的任何内容以及 提及或编入索引的内容都将归零。如果你这样做type b; b.field=value;,这里没有任何东西可以将任何未初始化的字段归零。

【讨论】:

  • 那行得通。太感谢了。你能简单解释一下原因吗?
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2021-08-06
  • 1970-01-01
  • 2021-11-08
  • 2019-08-10
相关资源
最近更新 更多