Я пытаюсь использовать указатели функций и абстрактные типы данных в 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'
Ну, для одного - он дает вам старый ответ, потому что произошла ошибка компилятора. Старый исполняемый файл программы все еще существует, так как новый никогда не был скомпилирован успешно. –
Когда он скомпилирован, он все еще имел этот аргумент 'functions.c: 11: 26: error: недопустимый тип унарного '*' (есть 'int') functions.c: 11: 45: ошибка: неверный аргумент типа унарного '*' (имеет 'int') 'ошибку. Но как-то он скомпилировался, и это сработало. Но когда я изменил, что-то пошло не так. –
Функция 'main()' возвращает 'int'; скажем так явно. В C99 вы можете опустить возврат из 'main()', но тогда вы должны иметь явный тип 'int'. В C89 вы не можете опустить возвращение законно. –