Я снова, я работаю над 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);
Любые идеи, что я должен делать?
Вы должны прочитать QSort Во-первых. Затем вы будете знать значение каждого параметра.
Ваш qsort должен быть таким:
qsort((void*)zip, count, sizeof(struct zipType), compare);
Третий параметр size
означает, что размер элемента в массиве должен быть zipType
не int
,
Чтобы исправить первую ошибку, вам нужно привести из 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
,