0

cで関数ポインタと抽象データ型を使用しようとしています。初めて使うのでとても戸惑います。とにかく、このコードをコンパイルしようとすると、エラーが発生しました。初めて実行したときは機能しました。しかし、switchとで引数を変更するab。それは私に古い答えを与え、決して更新されませんでした。

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'
4

2 に答える 2

3

関数を関数ポインターとして渡したい場合は、名前を入力するだけです。

new_hash(15, print_test, comp_func);

または、代わりに(そして同等に)、&シンボルを使用して、何が起こっているのかを明確にします。

new_hash(15, &print_test, &comp_func);
于 2012-05-01T01:03:00.597 に答える
2

使用する前に関数を宣言する必要があります。これを行わないと、コンパイラはそれがを返すと想定し、それintを逆参照しようとするとエラーを返します(intを逆参照することは不可能であるため)。

編集:関数ポインタの概念を誤解しているかもしれません。print_test(word)の結果を渡してはいけませんnew_hash-自分print_test自身を渡してください。(また、その戻りタイプを変更します)

于 2012-05-01T01:04:10.203 に答える