문제

그것은 단지 나 또는이 코드가 들어가는 것입니까? 진주 프로그래밍 잘못 되었습니까 (QuickSort가 2 개의 const voids를 원합니다. 그렇다면 내 솔루션이 맞습니까? 사과, 그냥 배우는 ...

int wordncmp(char *p, char* q)
{   int n = k;
    for ( ; *p == *q; p++, q++)
        if (*p == 0 && --n == 0)
            return 0;
    return *p - *q;
}

int sortcmp(char **p, char **q)
{   return wordncmp(*p, *q);
}
...

qsort(word, nword, sizeof(word[0]), sortcmp);

이것이 해결책입니까?

int sortcmp(const void *p, const void *q)
{   return wordncmp(* (char * const *) p, * (char * const *) q);
}
도움이 되었습니까?

해결책

첫 번째 코드 샘플은 아마도 거의 모든 컴파일러 및 CPU에서 작동 할 것입니다. 그러나 C 표준을 따라 문자의 C 표준을 따르면 기술적으로 정의되지 않은 행동입니다.

당신이 말했듯이, 마지막 주장은 qsort() 유형의 두 인수를 취하는 함수에 대한 포인터입니다. const void*. sortcmp 다른 논쟁을 취합니다. 컴파일러 ~해야 한다 호환되지 않는 유형 서명 또는 무언가에 대한 경고를 제공하십시오. 어쨌든, 캐스트는 한 유형의 함수에서 다른 유형의 함수로 수행됩니다.

C 표준은 다른 유형의 다른 기능 포인터에 함수 포인터를 캐스트 할 수 있다고 지정하지만 피로 회의를 할 수는 없으며 캐스트 된 기능 포인터를 호출 할 수는 없습니다. 그러나 함수 포인터를 원래 유형으로 다시 캐스트하는 경우 동작을 정의한 호출-원래 함수라고합니다.

당신은 a에서 캐스팅하고 있기 때문에 int (*)(char**, char**) a int (*)(const void*, const void*), 그리고 결국 qsort() 비교 기능을 다시 캐스팅하지 않고 호출하고 있습니다. int (*)(char**, char**), 그것은 정의되지 않은 행동입니다.

그러나 사실상 모든 아키텍처에서는 a char ** 그리고 a const void* 같은 방식으로 표시되며 기능 호출은 거의 항상 작동합니다.

정의 된 동작을 얻으려면 비교기 기능에 적절한 유형의 서명이 있는지 확인한 다음 인수를 적절한 유형에 시전 할 수 있습니다. 솔루션은 정확히 정확하며 C 표준을 위반하지 않습니다. 잘 했어 const-조정 -많은 사람들이 정확히 무엇을 이해하지 못합니다. char * const * 수단.

당신은 또한 만들어야합니다 wordncmp() 매개 변수를 가져옵니다 const char*, 당신은 매개 변수를 수정하지 않기 때문에.

참고 사항 : 기술적으로 데이터 포인터에 대한 기능 포인터를 캐스팅 할 수 없습니다 (예 : void*) 혹은 그 반대로도. 이 표준은 기능 포인터와 데이터 포인터가 크기가 다르기 위해 허용합니다. 컴퓨터에서 작동하더라도 항상 작동하는 것은 아닙니다.

다른 팁

당신은 맞습니다, 서명입니다 sortcmp 무엇과 일치하지 않습니다 qsort 기대합니다. 수정이 옳습니다. wordcmp 또한 만들어야합니다 const-기술적으로 일부를 잃어버린 것처럼 const-길을 따라.

int wordncmp(const char *p, const char* q)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top