2010-07-24 5 views
0

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

#include <stdio.h> 
#include <iostream> 
#include <string.h> 
using namespace std; 
using std::qsort; 
int charcmp(char*x,char *y){ return *x-*y;} 
#define wordmax 100 
int main(void){ 
    char word[wordmax]; 
    char sig[wordmax]; 
    while(scanf("%s",word)!=EOF){ 
     strcpy(sig,word); 
     qsort(sig,strlen(sig),sizeof(char),charcmp); 
     printf("%s %s\n",sig,word); 
    } 


    return 0; 
} 

ошибка:

1>------ Build started: Project: anagrams, Configuration: Debug Win32 ------ 
1> anagrams.cpp 
1>c:\users\david\documents\visual studio 2010\projects\anagrams\anagrams.cpp(11): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
1>   c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(304) : see declaration of 'scanf' 
1>c:\users\david\documents\visual studio 2010\projects\anagrams\anagrams.cpp(13): error C2664: 'qsort' : cannot convert parameter 4 from 'int (__cdecl *)(char *,char *)' to 'int (__cdecl *)(const void *,const void *)' 
1>   None of the functions with this name in scope match the target type 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

я думаю, Йона bentley должен знать такую ​​тему, да, почему такая ошибка?

+0

Сообщение об ошибке достаточно ясно: «невозможно преобразовать параметр 4 из« int (__cdecl *) (char *, char *) »в 'int (__cdecl *) (const void *, const void *)'". Вы посмотрели на типы значений, которые он ожидает для этого аргумента? – Gian

ответ

4

Ваша charcmp функция должна принимать const void* параметры:

int charcmp(const void* x, const void* y) 
{ 
    return *(const char*)x - *(const char*)y; 
} 

Сообщение об ошибке:

не может преобразовать параметр 4 из 'int (__cdecl *)(char *,char *)' в 'int (__cdecl *)(const void *,const void *)'

говорит вам, что аргумент вы передаете (указатель на функцию charcmp) не имеет правильного типа, который должен быть передан в qsort.

Поскольку этот вопрос отмечен как C++, вы можете вместо этого использовать std::sort; это типобезопасно и гораздо проще в использовании:

std::sort(sig, sig + strlen(sig)); 
1

Ошибка в поиск является

int (__cdecl *)(char *,char *)' to 'int (__cdecl *)(const void *,const void *)' 

Функция ожидает аргументы типа сопзИте пустоту *.

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