2012-02-22 3 views
0

Я не могу понять, как исправить ошибку компиляции C2664, которая сбила меня с ума всю ночь! Ошибка возникает из вызова qsort(). Я хочу, чтобы отсортировать массив ID2IX, хранящуюся в массиве, на который указывает radioIDs:Ошибка компиляции непонятной VC++ 6 C2664

typedef struct id2ix { // struct maps radio id to array index 
     int id; // radio id 
     int ix; 
     } ID2IX; 

    ID2IX  *RadioIDs = NULL; // radio IDs    integer 
..... 
    RadioIDs = (ID2IX*) malloc(totRadios * sizeof(ID2IX)); 
    if (RadioIDs == NULL) { 
    return FALSE; 
    } 
.....  
    // the qsort compar function 
    int // sort the id2ix array by radioID 
    //sort_by_radioID (ID2IX*one , ID2IX*two) { // tried this signature 
     sort_by_radioID (void*one , void*two) { // tried this signature, also 
     return ((ID2IX*)one)->id - ((ID2IX*)two)->id; 
    } 

    // call to qsort that will not compile 
    qsort(RadioIDs, totRadios, sizeof(ID2IX), sort_by_radioID); 

Я получаю ошибку из этого:

Objects.cpp(295) : error C2664: 'qsort' : cannot convert parameter 4 
    from 'int (void *,void *)' 
     to 'int (__cdecl *)(const void *,const void *)' 
None of the functions with this name in scope match the target type 

Какого черта я делаю не так?

EDIT: Спасибо, всем. Us C/ASM-кодировщики, мы не беспокоимсь о том, что нет ни одного проклятого const.

+1

Что произойдет, если вы добавите 'const' компилятор говорит вам не хватает? – Mat

+1

попробуйте с подписью 'int sort_by_radioID (const void * one, const void * two)'. – Naveen

+1

проверить, что вы также вызываете вызов по умолчанию, если это не '__cdecl', вам нужно использовать экспликацию' __cdecl' для функции – Necrolis

ответ

2

подпись Изменить sort_by_radioID «s к:

междунар __cdecl sort_by_radioID (сопзЬ пустота * одна, сопзЬ пустота * два)

И убедитесь, что вы приводите к const ID2IX* внутри функции.

(если __cdecl является тип вызова по умолчанию, вы можете пропустить его. Попробуйте без него и посмотреть, если он компилирует)

1

попробовать подпись sort_by_radioID (const ID2IX * one , const ID2IX * two)

1

Ваша функция сравнения имеет неправильную подпись (QSort ожидает другой тип указателя функции).

Решение: смените вашу функцию на: int sort_by_radioID (const void * one, const void *); Помните также, чтобы изменить литье указателей в теле вашей функции сравнения на 'const ID2DX *'.