2011-12-09 40 views
6

nếu tôi có một mảngmảng loại tăng gấp đôi trong C

double i[5] = {1.023, 1.22, 1.56, 2, 5, 3.331}; 

làm thế nào để sắp xếp các giá trị để họ trông như thế này:

double i[5] = {1.023, 1.22, 1.56, 2, 3.331, 5}; 

tôi đã cố gắng qsort() mà không may mắn, sau khi thử một số ví dụ, tôi đến với:

qsort(i, 5, sizeof(double), sort); 

int sort(const void *x, const void *y) 
{ 
return (*(double*)x - *(double*)y); 
} 

với => lỗi: loại không tương thích cho lập luận 1 không sắp xếp mảng .....

+1

"loại không tương thích cho đối số 1" bạn có chắc là bạn đang biên dịch dạng này thành C chứ không phải C++? Nếu bạn thực sự phải biên dịch nó dưới dạng C++, thì hãy chuyển nó thành (void *). –

+1

Chỉ cần cho rõ ràng, thói quen so sánh của bạn nên được gọi là cái gì đó như 'so sánh', không phải' sắp xếp'. –

Trả lời

13

Đối số đầu tiên là qsort là con trỏ đến đầu của mảng cần sắp xếp. Thay vì

qsort(i[5], 5, sizeof(double), sort); 

nó nên đọc

qsort(i, 5, sizeof(double), sort); 

Một số quan sát thêm:

  1. Chiều dài của initializer i 's là không chính xác (i có năm yếu tố, tuy nhiên initializer có sáu) .
  2. Mã hóa cứng 5 vào cuộc gọi qsort đang yêu cầu sự cố sau này.
  3. Tên "i" được sử dụng phổ biến nhất cho bộ đếm vòng lặp và các loại tương tự.
  4. Gọi hàm so sánh sort gây nhầm lẫn.
  5. Chức năng so sánh của bạn sai. Hãy xem xét cách so sánh số này với các số 1.11.2. Ngoài ra hãy nghĩ về điều gì sẽ xảy ra nếu sự khác biệt giữa hai giá trị không phù hợp với một số int.

tôi sẽ viết lại toàn bộ ví dụ của bạn như sau:

double arr[] = {1.023, 1.22, 1.56, 2, 5, 3.331}; 

int cmp(const void *x, const void *y) 
{ 
    double xx = *(double*)x, yy = *(double*)y; 
    if (xx < yy) return -1; 
    if (xx > yy) return 1; 
    return 0; 
} 

int main() { 
    qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0]), cmp); 
} 

Lưu ý rằng chức năng so sánh ở trên vẫn không xử lý một cách chính xác Nans; Tôi để nó như một bài tập để người đọc sửa lỗi đó.

+0

opps, typo, tôi đã cập nhật câu hỏi, nhưng bây giờ, nó không trả về mảng đã sắp xếp: ( – tom91136

+0

Tôi đã thử ví dụ của bạn, nhưng mảng được sắp xếp trông giống hệt nhau. – tom91136

+0

@ Tom91136: Chức năng 'sắp xếp' của bạn sai. Câu trả lời cập nhật – NPE

Các vấn đề liên quan