2

アルゴリズムを使った実験のためにXcodeで簡単なプロジェクトを作成しましたが、今はマージソートを実装しようとしています。マージソート関数のプロトタイプは

//mergesort.h
void merge(long *left, long *right, int lsize, int rsize);
void mergesort(long *data, int datasize);

実装は

//mergesort.c
void merge(long *left, long *right, int lsize, int rsize){

int i = 0, j = 0, k = 0;
long *temp = malloc(sizeof(long) * (rsize + lsize));

while(i < lsize && j < rsize){
    if(left[i] < right[j]){
        temp[k++] = left[i++];
    }else{
        temp[k++] = right[j++];
    }

    if(i == lsize){
        for(;j < rsize;){
            temp[k++] = right[j++];
        }
    }

    if(j == rsize){
        for(;i < lsize;){
            temp[k++] = left[i++];
        }
    }
}
memcpy(left, temp, sizeof(long) * (lsize + rsize));
free(temp);
}

void mergesort(long *data, int datasize){
    int lsize, rsize;
    lsize = datasize / 2;
    rsize = datasize - lsize;

    if(lsize  < 1 || rsize < 1){
        return;
    }else{
        mergesort(data, lsize);
        mergesort(data + lsize, rsize);
        merge(data, data + lsize, lsize, rsize);
    }

問題は、コードをコンパイルできないことです。コンパイラが次のように言っているのではないかと思いました。mergesort()の呼び出し、つまりmergesort(data、lsize)で、「関数呼び出しの引数が少なすぎます。4が必要です。マージソート(データ+ lsize、rsize);

何故ですか?デフォルトのxcodeコンパイラの奇妙な機能ですか、それとも何か間違ったことをしていますか?

4

1 に答える 1

6

あなたの問題は、ほぼ確実に、関数がプロトタイプmergesortですでに定義されていることです。<stdlib.h>

int
 mergesort(void *base, size_t nel, size_t width,
     int (*compar)(const void *, const void *));

つまり、4つの引数。したがって、失敗した呼び出しがどこにあっても、それは明らかにあいまいさを生み出しました。

おそらく最も安全な方法は、関数の名前を変更することです。

于 2013-02-15T20:30:25.487 に答える