0

ヘッダーファイルには、次の行があります。

typedef int comparator(int* left, int* right);

しかし、私がそのための関数定義を次のように書き込もうとしたとき:

int comparator (int* left, int* right){
    if(left<right) {
        return 1;
    } else if(right>left) {
        return -1;
    } else {
        return 0;
    }   
}

私が得るエラーは次のとおりです。

file.c:10:エラー:「コンパレータ」が別の種類のシンボルとして再宣言されました

関数はtypedefする必要があります。これは、後でヘッダーファイルで、次のようなメソッドプロトタイプで使用されるためです。

struct bst_node** search(struct bst_node** root, comparator compare, void* data);

では、このメソッドはどのように構築されますか?

4

3 に答える 3

4

ヘッダーファイルには、

 int comparator(int* left, int* right);

型を宣言するのではなく、関数を宣言するだけです。

コンパレータと呼ばれる関数ポインタ型を宣言できます。

typedef int (*comparator)(int* left, int* right);

ただし、コンパレータと呼ばれる関数は作成しません。同じシグネチャで関数を作成する必要があります

int ascending_comparator(int* left, int* right)
{
    // comparison
} 

その後、電話

search(root, ascending_comparator, data);

また、int *ではなく実際のintを渡したくない、または関数内でポインターを比較したくないが、各intが指している値を比較するように感じました。

int comparator (int* left, int* right){
    if(*left < *right) {
        return 1;
    } else if(*right > *left) {
        return -1;
    } else {
        return 0;
    }   
}

ただし、intが格納されているメモリ位置を比較したい場合があります。

また、あなたの比較は同じです

if(left < right) 

と同じです

if( right > left)

だから多分あなたはしたい

 int comparator (int* left, int* right){
        if(*left < *right) {
            return 1;
        } else if(*left > *right) {
            return -1;
        } else {
            return 0;
        }   
    }
于 2012-12-22T20:28:30.070 に答える
3

実際にtypedefを作成するのではなく、プロトタイプを使用して関数を宣言したいのではないかと思います。書くだけで十分です

int comparator(int *left, int *right);
于 2012-12-22T20:28:19.917 に答える
2

typedefが間違いでない場合は、呼び出された型comparatorがあり、この識別子を関数に使用することはできません。既存の型が関数ポインターであるかどうかに関係なく、次のように記述した場合と同じになります。

typedef int myType;

int myType(int, int);

あなたはこのようなものでそれを使うことができますtypedef

typedef int (* comparator)(int, int);

int comparison(int, int);
void sort(int [], comparator);

int main(void)
{
  int array[10];
  sort(array, comparison);
}

関数宣言を探していて、それtypedefが間違いだった場合は、他の回答がすでに解決策を提供しています。

編集:たぶん私は間違っていますが、コメントを読んで、あなたはからあまりにも多くを期待しているようですtypedef。関数には型mainがあり(typeint ()(void)または)があり、それは型として使用できるとint ()(int, char **)言っているだけで、それはを意味します。comparatorint ()(int *, int *)

あなたが書く場合:

typedef double real;

オブジェクトを作成(技術的には定義)するのではなくdouble、「これからは」をreal意味するだけですdouble

于 2012-12-22T20:37:42.003 に答える