C ++ qsort внутри функции на массиве структур

Я снова, я работаю над qsort массива zipType«S. Функция сравнения, которую я написал, выглядит следующим образом:

    int compare(const void *v1, const void *v2){
const struct zipType *p1 = v1;
const struct zipType *p2 = v2;
if (p1->postalCode > p2->postalCode)
return(+1);
else if (p1->postalCode < p2->postalCode)
return(-1);
else
return(0);
}

Эта функция использует это:

   void binRead(zipType *zip, fstream *input){
int junk;
int count;
int end;
input->seekg(0,ios::end);
end=input->tellg();
count=input->tellg()/24;
input->seekg(0);

while(input->tellg()!=end){
for(int i=0;i<count;i++){
input->read((char*)( &(zip[i].postalCode) ), sizeof(int    ));
input->read((char*)( &junk ),                sizeof(int    ));
input->read((char*)( &(zip[i].longitude)  ), sizeof(double  ));
input->read((char*)( &(zip[i].latitude)   ), sizeof(double  ));
cout << "Currently at position" << input->tellg() << endl;
}
}

cout << "Array Created, Please wait while I sort" << endl;
qsort(zip, count, sizeof(int), compare);
usleep(3000000);
cout << "Array Sorted" << endl;

}

Я получаю сообщение об ошибке:

    invalid conversion from ‘const void*’ to ‘const zipType*’ [-fpermissive]
const struct zipType *p2 = v2;

И один из них:

     error: cannot convert ‘zipType’ to ‘void*’ for argument ‘1’ to ‘void qsort(void*, size_t, size_t, int (*)(const void*, const void*))’
qsort(*zip, count, sizeof(int), compare);

Любые идеи, что я должен делать?

0

Решение

Вы должны прочитать QSort Во-первых. Затем вы будете знать значение каждого параметра.

Ваш qsort должен быть таким:
qsort((void*)zip, count, sizeof(struct zipType), compare);

Третий параметр size означает, что размер элемента в массиве должен быть zipType не int,

0

Другие решения

Чтобы исправить первую ошибку, вам нужно привести из void* внутри процедуры сравнения:

auto p1 = static_cast<const struct zipType*>(v1);

Чтобы исправить вторую ошибку, я думаю, что мы снова должны привести, но на этот раз void*:

qsort(static_cast<void*>(zip), count, sizeof(zipType*), compare)

Честно говоря, я не уверен, зачем нужен этот актерский состав. Если я правильно помню свои правила конвертации, zipType* должен быть конвертируемым в void* неявно. Если кто-то знает, оставьте комментарий, и я отредактирую ответ или, если вы можете, просто отредактируйте ответ.

Обратите внимание, что вы хотите размер элементов в массиве для третий параметр, не sizeof(int) Вот. У вас есть массив zipType* не int,

Поскольку вы используете C ++ (вывод, потому что вы используете std::cout) хоть попробуй std::sort. Он более безопасен для типов и часто может быть лучше оптимизирован.

std::sort(zip, std::advance(zip, count), compare)

Кроме того, поскольку это C ++, вам не нужно говорить struct zipType, Вы можете просто сказать zipType,

1

По вопросам рекламы [email protected]