函数指针不适用于int

时间:2016-11-29 15:44:48

标签: c pointers

我试图使用函数指针的功能,一切顺利,直到我试图让函数指针使用第二个参数作为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 *'

2 个答案:

答案 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;
}