我试图使用函数指针的功能,一切顺利,直到我试图让函数指针使用第二个参数作为int类型。
以下代码会生成错误,如下所示 在头文件中:
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct UnitTag {
int x;
int y;
void (*move)(Unit, int);
} Unit;
错误:
error: expected ‘)’ before ‘int’
void (*move)(Unit, int);
^
无效(*移动)(单位);工作得很好,令我惊讶的是添加参数会导致错误。
我在C文件中调用我的struct,通过包含标题然后执行: 单位单位[UNITCOUNT]; 单位[0] .move(&amp; units [0],1);
更新
中加入:
typedef struct UnitTag Unit
导致错误消失,但我不能再像以前一样使用该功能了。
error: incompatible type for argument 1 of ‘units[i].move’
units[0].move(&units[0], 0);
^
注意:预期的'Unit'但参数类型为'struct UnitTag *'
答案 0 :(得分:3)
如果我找到你,你只需使用struct
关键字:
#include <stdio.h>
typedef struct UnitTag {
int x;
int y;
void (*move)(struct UnitTag, int);
} Unit;
void Test (struct UnitTag test1, int test2)
{
printf("Test1.x: %d\n", test1.x);
printf("Test1.y: %d\n", test1.y);
printf("Test2 : %d\n", test2);
}
int main(void)
{
Unit units[100];
units[0].move = Test;
units[0].x = 1;
units[0].y = 2;
units[0].move(units[0], 3);
}
输出:
Test1.x: 1
Test1.y: 2
Test2 : 3
如果你想通过referebce传递struct,只需:
#include <stdio.h>
typedef struct UnitTag {
int x;
int y;
void (*move)(struct UnitTag*, int);
} Unit;
void Test (struct UnitTag *test1, int test2)
{
test1->x = 4;
test1->y = 5;
}
int main(void)
{
Unit units[100];
units[0].move = Test;
units[0].x = 1;
units[0].y = 2;
units[0].move(&units[0], 3);
printf("units[0].x: %d\n", units[0].x);
printf("units[0].y: %d\n", units[0].y);
}
输出是:
units[0].x: 4
units[0].y: 5
答案 1 :(得分:1)
在使用之前你需要Unit的原型。
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct UnitTag Unit;
typedef struct UnitTag {
int x;
int y;
void (*move)(Unit, int);
} Unit;
int main(void)
{
return 0;
}
澄清你想做什么之后。给一个指向Unit的指针可能更有意义,因此返回void的move命令可以改变你的对象。
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct UnitTag Unit;
typedef struct UnitTag {
int x;
int y;
void (*move)(Unit *, int);
} Unit;
Unit test;
/* some function that corresponds to the interface */
void myMove(Unit *u, int i)
{
u->x = u->x + i;
}
int main(void)
{
/* initialize test struct */
test.x = 0;
test.y = 0;
test.move = myMove;
test.move(&test, 5);
printf("Values after move are (x, y) = (%i, %i).\n", test.x, test.y);
return 0;
}