2013-02-15 3 views
2

Я создал простой проект в Xcode для экспериментов с алгоритмами, теперь я пытаюсь реализовать mergesort. Прототип функции является слияниемПроблемы с компилятором 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); 
    } 

Так проблема в том, что я не могу скомпилировать код. Мне было интересно, компилятор говорит: «Слишком мало аргументов для вызова функции, ожидаемый 4, имеют 2" на вызовах mergesort(), то есть на mergesort (data, lsize); mergesort (data + lsize, rsize);

Почему? Это странная особенность компилятора xcode по умолчанию, или я делаю что-то неправильно?

+0

В какой строке вы принимаете ошибку? – Pete

+0

на линии с рекурсивными вызовами 'mergesort (data, lsize);' 'mergesort (data + lsize, rsize);' и при первом вызове функции в main() body –

ответ

6

Ваша проблема почти наверняка, что функция mergesort уже определена в <stdlib.h> с прототипом:

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

т.е. четыре аргумента. Таким образом, очевидно, что возникла двусмысленность, где бы ни был неудачный вызов.

Возможно, самое безопасное в том, чтобы переименовать вашу функцию.

+0

Так как это в Xcode, вы можете проверить гипотезу Томми по команде -вызыв вызова слияния в вашем коде. Это откроет файл, в котором он определен. – Nocturno

+0

Большое спасибо! Я был смущен, потому что на моем другом компьютере с linux и gcc-компилятором не было проблем –

Смежные вопросы