【问题标题】:Static array initialization with pointer to extern struct element?使用指向外部结构元素的指针进行静态数组初始化?
【发布时间】:2015-05-08 00:18:09
【问题描述】:

我想静态初始化一个数组,但它的一些元素是指向外部结构的指针。

我不能将结构声明为常量,因为它们的元素在其他地方被修改,也不是静态的,因为它与外部声明冲突。

有没有办法在静态数组初始化中解决这个问题,或者我必须在函数中对其进行初始化?

编辑: 在一次出色的发布后查看您的示例,我发现错误是我使用的是 PWMD2 而不是 &PWMD2(其中 PWMD2 是外部结构)。

显然错误是

错误:初始化元素不是常量

只是为了指出我在做什么,部分代码(使用 ChibiOS)如下:

esc.h

extern struct Engine{
    GPIO_TypeDef *gpio;
    uint8_t pin;

    PWMDriver *driver;
    pwmchannel_t channel;
    pwmcnt_t width;
}engines[];

esc.c

struct Engine engines[] = {
    {GPIOD, 3, &PWMD2, 0, 0},
    {GPIOD, 4, &PWMD2, 1, 0},
    {GPIOD, 6, &PWMD2, 2, 0},
    {GPIOD, 7, &PWMD2, 3, 0},
};

【问题讨论】:

  • 你写了什么代码,遇到了什么错误?
  • 每当你遇到这样的人为问题时,听起来就像是程序设计以某种方式被破坏了。那么问题的真正解决方案是修复程序设计。
  • @Lundin 你能解释一下你的评论吗?您所说的“人为问题”是什么意思?设计是如何被破坏的?
  • 这:“我想静态初始化一个数组,但它的一些元素是指向外部结构的指针”听起来像意大利面条编码与各种全局变量。您的所有变量都是常量,然后就可以了,或者它们不是,在这种情况下,应该在运行时设置结构。如果我根据您发布的内容猜测该程序的功能,那么您有一个引擎驱动程序,它使用 PWM 和 GPIO。在这种情况下,这些资源可能应该在运行时传递给驱动程序。
  • 另外,在编写嵌入式系统时,依赖静态存储持续时间变量的预初始化通常是不好的做法。在使用变量之前,您应该始终在运行时手动初始化它们。因为在真正的嵌入式系统上只存在运行时:您不想在程序开始时依赖一些向下复制的 sn-p,有时您也不希望在启动时使用它来提高性能原因。大多数编译器支持从 .data/.bss 中省略复制的非标准方式,这通常甚至是默认设置。

标签: c arrays initialization


【解决方案1】:

详细说明您的问题,因为以下内容对我来说没问题,据我所知,这就是您要求做的事情:

main.c

#include <stdio.h>

#include "externs.h"

static struct_int_t* initextint[1] = { &extint };

int main( int argc, char* argv[] )
{
    printf( "extint: %d\n", initextint[0]->value );
    return 0;
}

externs.h

#ifndef EXTERNS_H
#define EXTERNS_H

typedef struct {
    int value;
    } struct_int_t;

extern struct_int_t extint;

#endif

externs.c

#include "externs.h"

struct_int_t extint = { 10 };

编译:

C:\>gcc main.c externs.c

运行:

C:\>a
extint: 10

【讨论】:

    【解决方案2】:

    例如,以下应该可以工作。你得到什么错误?你在什么编译器和平台上? (您可以酌情删除consts——它们不是必需的。)

    struct.h

    typedef struct My_struct {
        int n;
    } My_struct;
    
    extern const My_struct s1, s2;
    

    struct.c:

    #include "struct.h"
    
    const My_struct s1 = { 1 }, s2 = { 2 };
    

    arr.c

    #include <stdio.h>
    #include "struct.h"
    
    static const My_struct *const arr[2] = { &s1, &s2 };
    
    int main(void) {
        printf("arr[0]->n = %d, arr[1]->n = %d\n", arr[0]->n, arr[1]->n);
    
        return 0;
    }
    

    用例如编译

    $ gcc arr.c struct.c -o struct_arr
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2021-10-27
      • 2020-04-07
      相关资源
      最近更新 更多