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

如何在C中初始化结构数组?,c,struct,arm,iar,C,Struct,Arm,Iar,我使用ARM处理器在开发板上编码,所以我使用IAR WORKBENCH作为IDE。我想知道为什么编译器在训练手动初始化结构数组时会给我一个错误,代码如下: 结构定义: 尝试初始化结构的数组: IDLE、LOW、MED和HIGH—是具有无符号整数值的宏 编译器错误: 错误[Pe144]:类型为“unsigned int”的值不能用于初始化类型为“Task*”的实体 错误[Pe144]:类型为“void(*)(void)”的值不能用于初始化类型为“Task*”的实体 错误[Pe146]:初始值设定项

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

尝试初始化结构的数组:

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

编译器错误:

错误[Pe144]:类型为“unsigned int”的值不能用于初始化类型为“Task*”的实体
错误[Pe144]:类型为“void(*)(void)”的值不能用于初始化类型为“Task*”的实体
错误[Pe146]:初始值设定项值太多

欢迎任何帮助

如果需要指针,可以执行以下操作:

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[3] = {
        &(Task) {HIGH , Switch_LED_RED , IDLE},
        &(Task) {MED , Switch_LED_RED , IDLE},
        &(Task) {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},
};
没有任务*,只有任务。空[]allready将其指定为数组

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

#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;
}
#包括
#包括
#包括
#包括
typedef void(*函数)(void);
静态int-i;
#定义高10
#定义MED 5
#定义低1
#定义空闲1
无效开关指示灯红色(无效){
i++;
}
无效重置指示灯(无效){
i++;
}
类型定义结构任务
{
uint8_t优先级;
函数func;
uint8执行状态;
}任务;
任务任务数组测试[]={
{高,&开关指示灯为红色,空闲},
{MED,&Switch_LED_RED,IDLE},
{低,&Reset_LED,空闲},
};
int main(){

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

Task task_array_test[] = {
        HIGH , Switch_LED_RED , IDLE,
        MED ,  Switch_LED_RED , IDLE,
        LOW ,  Reset_LED      , IDLE
};
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
指针指向类型的指针,因为
函数本身是指针:

typedef void (*Function)(void);
相反,它应该是:

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

另外,在将函数分配给函数指针时,不需要将函数名与
&
一起使用。函数名给出函数的地址。

你不能这样初始化它-需要你自己的初始化代码。你的
任务数组数组测试
是一个由3个指针组成的数组。也许你只需要
任务数组数组测试[3]=};
@artm你什么意思?@pmg不需要星号,谢谢!请在你的问题(或下一个问题)中提供一些。别忘了配置你的编译器(不仅仅是你的IDE)若要启用警告,请使用交叉编译器,将
-Wall-Wextra
传递到。另请参阅您编写的代码不起作用。无论如何,我找到了答案,这要归功于@pmg。@Tungsteel确信您需要更改调用函数的方式。如果您也有未定义
func
的情况,则将其保留为指针是可以的<代码>空值
有效