0

関数に渡すことができる関数を指す関数変数を作成しようとしていますが、以下のコードを実行しようとするとqsort()代入型の不一致」エラーが発生しました。

int compareFunc (const void * a, const void * b)
{
   //codes
}

int main(void) {
  int *ptr;     //create a function pointer variable that point to compareFunc
  ptr = &compareFunc   //Initialize function pointer
  //codes
  return 0;
}

誰かが私が間違っていたことを教えて、正確に説明してもらえますconst void *か?

4

5 に答える 5

2

ポインターの宣言は関数ポインターではありません。普通のポインタです。次のように関数ポインタを宣言するように変更する必要があります。

int (*fptr) (const void *a, const void *b);
fptr = compareFunc;

関数ポインターの場合、& 演算子を使用して明示的にアドレスを取得する必要はありません。

またconst void *、ポインターが指すオブジェクト/データがその関数で変更されないことも意味します。そのため、ポインターが指す値に対して書き込み操作を実行するたびに、コンパイラーはエラーを発生させます。

于 2013-11-07T04:37:57.757 に答える
1

関数ポインタは次のように宣言されます。

return_type (* variable_name)(params)

だからあなたの場合:

int (*cfptr)(const void * a, const void * b);
cfptr = compareFunc;
于 2013-11-07T04:39:42.660 に答える
0

aを実行すると、次のman qsortものが得られます (他にも):

void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *) );

強調された部分は明らかにあなたが探しているものでなければなりません。

于 2013-11-07T08:28:25.487 に答える
0

int *関数ポインターではなく、オブジェクトポインターのタイプであるためです。

として宣言するか、関数ポインターの宣言を簡素化するためにint (*ptr)(const void *,const void *);使用できます。typedef

typedef int (*comptr)(const void *a, const void *b);
int compareFunc (const void * a, const void * b)
{
   //codes
}

int main(void) {
  comptr ptr;     
  ptr = compareFunc;  
  //codes
  return 0;
}

また、関数名は自動的に関数ポインタに変換されるため、 の代わりにptr = &compareFunc;を省略できることに注意してください。&

于 2013-11-07T04:38:23.967 に答える
0

関数ポインタの宣言が正しくありません。通常のポインターを宣言しています。関数ポインタ宣言の構文は次のとおりです。

<return_type> (* func_ptr_Variable_name) ( [params...] )

関数ポインターは次のようになります。

int main(void){
   int (*ptr)(const void *,const void *);
   ptr = compareFunc;   //'&' is not needed here, function name is automatically converted to its address 
   ...
   return 0;
}

const void *単に、void *ポインターが指すデータを関数内で変更できないことを意味します。

于 2013-11-07T04:38:58.627 に答える