2013-05-07 3 views
0
Vector<Medicine*>* Controller::sortByStockAsc(){ 
     Vector<Medicine*>* all =repo->getAll(); 
     qsort(all, all->getNrMed(),sizeof(Medicine*), (comparefunction) compareNA); 
     return all;} 

위의 코드가 있으며 qsort에 몇 가지 문제가 있습니다. Vector<Medicine*>*은 정렬해야하는 포인터 배열에 대한 포인터입니다. getAll()Vector <Medicine*>*을 반환합니다. 문제 중 하나는 qsort()에 내 getNrMed()이 없지만이 기능이 정의 된 모듈을 지정했기 때문입니다. 함수는 다음과 같습니다.Qsort 딜레마 (C++)

int MedRepository::getNrMed(){ 
    return MedList->getSize(); 
} 

을 반환하고 int을 반환합니다. 내가 뭘 잘못하고있어?

+0

'벡터'란 무엇입니까? 'qsort'를 사용하는 것은 매우 잘못된 것처럼 보입니다. –

+0

'class Vector { 개인 : \t T * Elems; \t int 크기; \t int 용량 : ' + 생성자, 소멸자 및 getter – Matt

+3

"내 qsort에 문제가 있음"을 의미 할 수도 있습니다. 모기지를 지불 할 수 없기 때문에 우울한가? 'qsort()'는'memcpy()'를 사용하여 객체를 교환하기 때문에'std :: sort()'를 사용하십시오. 이것은 항상 C++ 객체에는 적합하지 않습니다. –

답변

1

qsortVector<T>*이 아닙니다. 벡터의 첫 번째 요소에 대한 포인터를 사용합니다.

getNrMedVector<T>의 방법이 아니며, MedRepository의 방법입니다.이 코드는 다른 곳에서도 볼 수 없습니다.

compareNA에 캐스트를 넣어야한다는 사실은 심각한 문제의 징조입니다. 거의 입니다. 함수 포인터를 캐스팅해도 안전합니다. 캐스트없이 컴파일해야합니다.

의심 할 여지없이 여기서 코드 품질을 고려할 때 추가적인 문제가 있습니다. 이는 제한된 코드 수를 감안할 때 진단 할 수있는 것입니다.

+0

캐스트없이 컴파일 할 수있는 방법은 무엇입니까? 내가 상층 파편 옆에 보여 져야한다고 생각하니? – Matt

+1

캐스트없이 컴파일하려면 함수 프로토 타입을'qsort()'에 의해 예상되는 것으로 변경하십시오. 그 비교 함수의 첫 번째 일은 void 포인터를 유형이 지정된 포인터로 다시 변환하는 것입니다. 자신에게 유리하게 이것을 사용하여 간단한 정수 배열을 정렬합니다. 즉,이 테스트에 익숙해 지도록 별도의 테스트 프로젝트를 만듭니다. –

+1

남자, 당신은 당신의 깊이에서 벗어났습니다. 당신은 유익하게 고용 된 것처럼 보입니다. 다른 기술자에게 직접 가서 도움을 청할 수 있습니까? SO를 통해 이것을 디버깅하려고하면 당신이 무엇을하고 있는지 모를 때 악몽이 될 것입니다. – StilesCrisis