问一个C语言的结构体的函数指针和数组之间的问题
发布网友
发布时间:2024-02-16 19:59
我来回答
共5个回答
热心网友
时间:2024-02-20 13:46
按你原来那样写,编译之后,这样报错:
[root@localhost test]# gcc 6.c
6.c:20: error: initializer element is not constant
6.c:20: error: (near initialization for ‘KeyboardTab[0].CurrentOperate’)
6.c:21: error: initializer element is not constant
6.c:21: error: (near initialization for ‘KeyboardTab[1].CurrentOperate’)
6.c:22: error: initializer element is not constant
6.c:22: error: (near initialization for ‘KeyboardTab[2].CurrentOperate’)
6.c:23: error: initializer element is not constant
6.c:23: error: (near initialization for ‘KeyboardTab[3].CurrentOperate’)
6.c:24: error: initializer element is not constant
6.c:24: error: (near initialization for ‘KeyboardTab[4].CurrentOperate’)
把源代码修改成这样:
KeyTabStruct KeyboardTab[43] =
{
{0 ,0 ,0 ,1 ,0 ,&Menu0},
{1 ,1 ,1 ,2 ,42,&Menu1},
{2 ,2 ,2 ,3 ,42,&Menu2},
............
{41,41,41,42,40,&Menu41},
{42,42,42,0 ,0 ,&Menu42}
};
其余的不变,之后编译,结果为
[root@localhost test]# gcc 6.c
6.c:20: warning: initialization from incompatible pointer type
6.c:21: warning: initialization from incompatible pointer type
6.c:22: warning: initialization from incompatible pointer type
6.c:23: warning: initialization from incompatible pointer type
6.c:24: warning: initialization from incompatible pointer type
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
再加上main函数即可。
原因:指针即地址,函数指针也不例外,调用函数指针的时候,用的是函数所在的地址,“&”是取地址符。
热心网友
时间:2024-02-20 13:47
void (*Menu0)(void);
void (*Menu1)(void);
void (*Menu2)(void);
//......
void (*Menu41)(void);
void (*Menu42)(void);
/*先定义一个结构体*/
typedef struct
{
unsigned char KeyStateIndex; //当前状态索引号
unsigned char KeyDownState; //按下“向下”键时转向的状态索引号
unsigned char KeyUpState; //按下“向上”键时转向的状态索引号
unsigned char KeyEnterState; //按下“确认”键时转向的状态索引号
unsigned char KeyBackState; //按下“返回”键时转向的状态索引号
void (*CurrentOperate)(void);
}KeyTabStruct;
/*再定义一个数组*/
KeyTabStruct KeyboardTab [43] =
{
{0 ,0 ,0 ,1 ,0 ,(&Menu0)},
{1 ,1 ,1 ,2 ,42,(&Menu1)},
{2 ,2 ,2 ,3 ,42,(&Menu2)},
// ........
{41,41,41,42,40,(&Menu41)},
{42,42,42,0 ,0 ,(&Menu42)}
};
热心网友
时间:2024-02-20 13:47
{1 ,1 ,1 ,2 ,42,(*Menu1 )},
//改为:
{1 ,1 ,1 ,2 ,42,Menu1},
//后面其他行同理。
热心网友
时间:2024-02-20 13:48
{0 ,0 ,0 ,1 ,0 ,&Menu0}
......
对函数指针取地址,得到函数地址
热心网友
时间:2024-02-20 13:49
你的函数指针不是常量。所以编译不过,自己改改。追问怎么改成常量,指针我很少用,不怎么清楚,谢谢
追答说明白点就是类型不匹配。