0

Я пытаюсь использовать указатели функций и абстрактные типы данных в c. Это мой первый раз, когда я использую его, и я действительно смущен. В любом случае, когда я пытался скомпилировать этот код, я дал мне ошибку. В первый раз я побежал, это сработало. Но когда я изменяю аргументы переключателями a и b. Это дало мне старый ответ и никогда не обновлялось.Ошибка указателя функции

typedef struct data_{ 
    void *data; 
    struct data_ *next; 
}data; 

typedef struct buckets_{ 
    void *key; 
}buckets; 

typedef struct hash_table_ { 
    /* structure definition goes here */ 
    int (*hash_func)(char *); 
    int (*comp_func)(void*, void*); 
    buckets **buckets_array; 
} hash_table, *Phash_table; 

main(){ 

    Phash_table table_p; 
    char word[20]= "Hellooooo"; 
    int a; 
    a = 5; 
    int b; 
    b = 10; 
    /*Line 11*/ 
    table_p = new_hash(15, *print_test(word), *comp_func(&a, &b)); 

} 

int *print_test(char *word){ 
    printf("%s", word); 
} 

int *comp_func(int *i,int *j){ 

    if(*i < *j){ 
    printf("yeeeeeeee"); 
    }else{ 
    printf("yeaaaaaaaaaaaaa"); 
    } 
} 

Phash_table new_hash(int size, int (*hash_func)(char *), int (*cmp_func)(void *, void *)){ 
    int i; 
    Phash_table table_p; 
    buckets *buckets_p; 
    hash_table hash_table; 

    table_p = (void *)malloc(sizeof(hash_table)); 

    /*Setting function pointers*/ 
    table_p -> hash_func = hash_func; 
    table_p -> comp_func = cmp_func; 

    /*Create buckets array and set to null*/ 
    table_p -> buckets_array = (buckets **)malloc(sizeof(buckets_p)*(size+1)); 

    for(i = 0; i < size; i++){ 
    table_p -> buckets_array[i] = NULL; 
    } 

    return table_p; 
} 

Это сообщение об ошибке:

functions.c: In function 'main': 
functions.c:11:26: error: invalid type argument of unary '*' (have 'int') 
functions.c:11:45: error: invalid type argument of unary '*' (have 'int') 
Helloyeaaaaaaaaaaaaa 

Новая ошибка:

functions.c:11:3: warning: passing argument 2 of 'new_hash' makes pointer from integer without a cast [enabled by default] 
hash.h:29:13: note: expected 'int (*)(char *)' but argument is of type 'int' 
functions.c:11:3: warning: passing argument 3 of 'new_hash' makes pointer from integer without a cast [enabled by default] 
hash.h:29:13: note: expected 'int (*)(void *, void *)' but argument is of type 'int' 
+1

Ну, для одного - он дает вам старый ответ, потому что произошла ошибка компилятора. Старый исполняемый файл программы все еще существует, так как новый никогда не был скомпилирован успешно. –

+0

Когда он скомпилирован, он все еще имел этот аргумент 'functions.c: 11: 26: error: недопустимый тип унарного '*' (есть 'int') functions.c: 11: 45: ошибка: неверный аргумент типа унарного '*' (имеет 'int') 'ошибку. Но как-то он скомпилировался, и это сработало. Но когда я изменил, что-то пошло не так. –

+0

Функция 'main()' возвращает 'int'; скажем так явно. В C99 вы можете опустить возврат из 'main()', но тогда вы должны иметь явный тип 'int'. В C89 вы не можете опустить возвращение законно. –

ответ

3

Если вы хотите, чтобы передать функцию как функцию-указатель, просто введите имя:

new_hash(15, print_test, comp_func); 

или, альтернативно (и что то же самое), используйте & символ, чтобы понять, что происходит:

new_hash(15, &print_test, &comp_func); 
+0

Когда я пытался использовать символ '&', я получаю 'functions.c: 11: 26: error: lvalue, требуемый как унарный операнд '&'. functions.c: 11: 41: error: lvalue требуется как унарный '&' operand' –

2

Вы должны объявить функцию перед использованием. Если вы этого не сделаете, компилятор предполагает, что он возвращает int и дает вам ошибку при попытке разыменовать его (поскольку это невозможно для разыменования int).

EDIT: Вы также можете неправильно понимать концепцию указателей функций. вы не должны передавать результат от print_test(word) до new_hash - вам необходимо пройти print_test. (также, измените его тип возврата)

+0

Что значит изменить его тип возврата? –

+0

'print_test' возвращает' int * ', но' new_hash' хочет функцию, которая возвращает 'int'. – asaelr

+0

Спасибо. Это сделал трюк. –

Смежные вопросы