Непонятная ошибка компиляции VC ++ 6 C2664 - PullRequest
0 голосов
/ 22 февраля 2012

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

 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

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

РЕДАКТИРОВАТЬ: Спасибо всем. Мы, C / ASM кодеры, мы не беспокоимся, черт побери const.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

Измените подпись sort_by_radioID на:

int __cdecl sort_by_radioID (const void * one, const void * two)

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

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

1 голос
/ 22 февраля 2012

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

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

1 голос
/ 22 февраля 2012

попробуй подпись sort_by_radioID ( const ID2IX * one , const ID2IX * two)

...