2016-11-29 16 views
0

Я пытаюсь использовать силу указателей функций, все прошло нормально, пока я не попытался заставить указатель функции использовать второй аргумент как тип int.Функция указателя не работает для 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, включив заголовок, а затем: Единицы измерения [UNITCOUNT]; единиц [0] .move (& единиц [0], 1);

Update:

добавление:

typedef struct UnitTag Unit 

Вызывает ошибка исчезает, однако я больше не могу использовать функцию, как и раньше.

error: incompatible type for argument 1 of ‘units[i].move’ 
    units[0].move(&units[0], 0); 
^

Примечание: ожидаемый «Unit», но аргумент типа "STRUCT UnitTag *

+0

Он должен быть недействительным (* move) (struct UnitTag, int); Я не знаю, как void (* move) (Unit); работает для вас. – MayurK

+0

@MayurK, он дает такую ​​же ошибку даже при использовании «void (* move) (UnitTag, int)»; – LamaCoder

+0

@ LamaCoder Вы пропустили ключевое слово 'struct'. 'void (* move) (struct UnitTag, int);' – aschepler

ответ

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, просто:

#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 
+0

Кажется, что я работаю, но могу ли я изменить структуру, передаю ли я это по ссылке. – LamaCoder

+0

@ LamaCoder Я отредактировал. – LPs

+0

Я заменяю UnitTag на Unit в коде, а также удаляю ключевое слово struct в аргументе Test. И, похоже, он отлично работает, просто для улучшения удобочитаемости, неужели это плохая практика? – LamaCoder

1

Вам нужен прототип для блока перед его использованием.

#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, так что команда move, которая возвращает void, может что-то изменить в отношении вашего объекта.

#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; 
} 
+0

Не могли бы вы рассказать, как void (* move) (Unit); работает? – MayurK

+0

Он решил эту ошибку, однако теперь я не могу использовать эту функцию так же, как раньше, ошибка: ошибка: несовместимый тип для аргумента 1 из 'единиц [i] .move' единиц [i] .move (& units [i], циклы); ^ примечание: ожидается 'Unit', но аргумент имеет тип 'struct UnitTag *' Теперь я получаю эту ошибку везде, где я использую это. Определение массива: Единицы измерения [UNITCOUNT]; – LamaCoder

+1

Вы должны опубликовать код, в котором вы используете struct. – LPs