如何在 C 中初始化结构数组?

How to init a structure array in C?

我在带有 ARM 处理器的开发板上编码,所以我使用 IAR WORKBENCH 作为 IDE。我想知道为什么编译器在训练手动初始化结构数组时给我一个错误,代码如下: 结构定义:

typedef void (*Function)(void);

typedef struct _Task
{
    uint8_t priority;
    Function *func;
    uint8_t exec_state;
}Task; 

尝试初始化结构数组:

Task* task_array_test[3] = {
        HIGH , &Switch_LED_RED , IDLE,
        MED , &Switch_LED_RED , IDLE,
        LOW , &Reset_LED      , IDLE
};

IDLE、LOW、MED、HIGH - 是具有无符号整数值的宏。

编译器错误:

Error[Pe144]: a value of type "unsigned int" cannot be used to initialize an entity of type "Task *" 
Error[Pe144]: a value of type "void (*)(void)" cannot be used to initialize an entity of type "Task *" 
Error[Pe146]: too many initializer values 

欢迎任何帮助!

如果您需要指导,您可以这样做:

Task* task_array_test[] = {
    &(Task){HIGH , &Switch_LED_RED , IDLE},
    &(Task){MED , &Switch_LED_RED , IDLE},
    &(Task){LOW , &Reset_LED      , IDLE},
};

你试试这个代码

struct _Task
{
   int a,b,c;
}Task[3]; 
int main()
{
Task[0].a= HIGH;
Task[0].b= Switch_LED_RED;
Task[0].c= IDLE;
Task[1].a= MED ;
Task[1].b= Switch_LED_RED;
Task[1].c= IDLE;
Task[0].a= LOW ;
Task[0].b= Switch_LED_RED;
Task[0].c= IDLE;
}

首先是@pmg 已经提到的 - Task 类型的数组就可以了,可能不需要指针数组 Task*

此外,您不需要 func 也是 Function* 类型:

typedef void (*Function)(void);

typedef struct _Task
{
    uint8_t priority;
    Function func;
    uint8_t exec_state;
}Task; 

您的数组初始化将如下所示:

Task task_array_test[] = {
        HIGH , Switch_LED_RED , IDLE,
        MED ,  Switch_LED_RED , IDLE,
        LOW ,  Reset_LED      , IDLE
};

但我更喜欢将每个元素都放在大括号中以便更好地阅读:

 Task task_array_test[] = {
            { HIGH , Switch_LED_RED , IDLE },
            { MED ,  Switch_LED_RED , IDLE },
            { LOW ,  Reset_LED      , IDLE }
    };

您的代码有几个问题。

首先: 类型函数已经是指向函数的指针,无需再次将其声明为指针。这以指向函数指针的指针结束。

typedef struct _Task
{
    uint8_t priority;
    Function func; // Leave out the *
    uint8_t exec_state;
}Task;

第二个 初始化数组的正确方法应该是这样。

Task task_array_test[] = {
    {HIGH , &Switch_LED_RED , IDLE},
    {MED , &Switch_LED_RED , IDLE},
    {LOW , &Reset_LED      , IDLE},
};

没有任务*,只有任务。空的[] 已经指定为数组。

这是我写的一个小测试程序来证明它有效。

#include <stdint.h>
#include <string.h>
#include <iostream>
#include <stdio.h>

typedef void (*Function)(void);

static int i;

#define HIGH 10
#define MED  5
#define LOW  1
#define IDLE 1

void Switch_LED_RED(void){
   i++;
}

void Reset_LED(void){
   i++;
}

typedef struct _Task
{
    uint8_t priority;
    Function func;
    uint8_t exec_state;
}Task;

Task task_array_test[] = {
    {HIGH , &Switch_LED_RED , IDLE},
    {MED , &Switch_LED_RED , IDLE},
    {LOW , &Reset_LED      , IDLE},
};

int main(){    
    std::cout << "I starts with the value: " << i << std::endl;
    while (i < 3){
      task_array_test[i].func();  
    }
    std::cout << "I has now the value: " << i << std::endl;
    return 0;
}

您可以使用复合文字进行初始化,如下所示:

Task* task_array_test[3] = {
        &(Task) {HIGH , Switch_LED_RED , IDLE},
        &(Task) {MED , Switch_LED_RED , IDLE},
        &(Task) {LOW , Reset_LED      , IDLE}
};

您还可以这样做:

Task s1 = {HIGH , Switch_LED_RED , IDLE};
Task s2 = {MED , Switch_LED_RED , IDLE};
Task s3 = {LOW , Reset_LED      , IDLE};

Task* task_array_test[3] = {&s1, &s2, &s3};

在结构定义中,您将 func 成员声明为

Function *func;

这使得 func 指针指向类型的指针,因为 Function 本身就是一个指针:

typedef void (*Function)(void);

应该是:

typedef struct _Task
{
    uint8_t priority;
    Function func;       //Note that * removed
    uint8_t exec_state;
} Task; 

此外,在将其分配给函数指针时,您不需要将 & 与函数名称一起使用。一个函数名给出了函数的地址。