[問題] qsort的一些問題

看板C_and_CPP (C/C++)作者 (吹泡泡小雞)時間16年前 (2009/04/06 00:45), 編輯推噓4(4025)
留言29則, 4人參與, 最新討論串1/1
這是部分程式碼,不過我編譯時,就是qsort()那一個東西發生問題 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <algorithm> char* fileName = "studat.txt"; void test( ); void sort( ); void print( ); void print1( ); void getscore(); int myCompare(const void*a,const void *b); typedef struct{}tmp; typedef struct{ long id; char name[9]; int s1,s2,s3,s4; double final; float sum; }Student; Student student[3388],stmp; int main( ) { long long tStart, tStop; double tRun; getscore(); test( ); // 讀取檔案到記憶體 // 算出每個人的學期總成績 printf("Before sort...\n"); print( ); // 叫用 print( ) 印出部份資料 tStart = clock( ); sort( ); // 叫用 你的 sort 程式 tStop = clock( ); tRun = 1.0*(tStop - tStart)/CLOCKS_PER_SEC; printf("...Sorting done in %.5f seconds.\n", tRun); printf("After sort...\n"); print1( ); fprintf(stderr, "Hit ENTER key..."); getchar( ); return 0; } void print( ) { int i; printf("學號 姓名 s1 s2 s3 s4 平均成績\n"); printf("1~10個:\n"); for(i=0;i<10;i++){ printf("%ld %2s %2d %2d %2d %2d %.2f\n",student[i].id,student[i].name,student[i].s1,student[i].s2,student[i].s3,student[i].s4,student[i].sum); } printf("3378~3388個:\n"); for(i=3377;i<3388;i++){ printf("%ld %s %2d %2d %2d %2d %.2f\n",student[i].id,student[i].name,student[i].s1,student[i].s2,student[i].s3,student[i].s4,student[i].sum); } } 以上不是重點,但是重點來了!!!!!! int myCompare(const void*a,const void*b){ Student *p1=(Student*)a; Student *p2=(Student*)b; if((*p1).sum < (*p2).sum){ return -1;} if((*p1).sum>(*p2).sum){ return 1;} return 0; } void sort(){ int student_size=(sizeof(student)/sizeof(student[0])); qsort(student,student_size,sizeof(student),myCompare); } 問題來了,就是我這樣寫compiler會給我過,但是程式跑到一半,他就會跑出一個對話 視窗,他說應用程式發生錯誤, "0x004016e1"指令參考的.......記憶體。該記憶體不能為"read"。 請按[確定]終止程式 請按[取消]進行程式偵錯 但是神奇的就是如果我把student_size改成"1" 就是qsort(student,1,sizeof(student),myCompare); 這樣就可以執行而且還是對的! 因此我就困惑了?? 我是那裡寫錯呢?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.62.11

04/06 00:56, , 1F
靜態陣列宣告能那麼大?再來compare的return值是交換依據
04/06 00:56, 1F

04/06 01:00, , 2F
沒看到return 1,-1的部份  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄請忽略QQ
04/06 01:00, 2F

04/06 01:06, , 3F
如果宣告/定義在全域變數的 會反應在檔案大小
04/06 01:06, 3F

04/06 01:07, , 4F
這樣我要怎樣修改勒?靜態陣列好像沒有那麼大吼~
04/06 01:07, 4F

04/06 01:10, , 5F
呃....snowlike大大你講的後面那一句,我不懂欸?
04/06 01:10, 5F

04/06 01:10, , 6F
因為sizeof(student) != sizeof(Student)
04/06 01:10, 6F

04/06 01:10, , 7F
大小寫錯了
04/06 01:10, 7F

04/06 01:11, , 8F
且1 * sizeof(student) == student_size * sizeof(Student)
04/06 01:11, 8F

04/06 01:13, , 9F
不過Student他不是一個型別嘛?我上面有寫一個struct
04/06 01:13, 9F

04/06 01:13, , 10F
我寫這樣算個數應該不會有錯吧,不過他執行就是會有錯
04/06 01:13, 10F

04/06 01:13, , 11F
當然是型別啊... qsort需要的參數是(陣列,個數,元素大小)
04/06 01:13, 11F

04/06 01:13, , 12F
sizeof(Student) 才是單一個Student物件的大小
04/06 01:13, 12F

04/06 01:14, , 13F
sizeof(student)得到的是 3328個Student物件的大小
04/06 01:14, 13F

04/06 01:14, , 14F
如果你填student_size,sizeof(student)
04/06 01:14, 14F

04/06 01:15, , 15F
那會是3328個 (3328個Student) 的Student物件大小
04/06 01:15, 15F

04/06 01:15, , 16F
也就是3328 * 3328 * sizeof(Student)
04/06 01:15, 16F

04/06 01:15, , 17F
謝謝!我懂了
04/06 01:15, 17F

04/06 01:15, , 18F
與你原本想表達的"對3328個Student物件排序"的意思差多了
04/06 01:15, 18F

04/06 01:16, , 19F
不過原來我剛剛一直看錯啊...是3388 不是3328
04/06 01:16, 19F

04/06 01:22, , 20F
呵感謝解答,後面那句是以為myCompare只有return 0的意思
04/06 01:22, 20F

04/06 01:26, , 21F
只有return 0的意思?
04/06 01:26, 21F

04/06 01:27, , 22F
不是有一堆的if嘛?
04/06 01:27, 22F

04/06 01:33, , 23F
so 二樓才那樣說
04/06 01:33, 23F

04/06 12:19, , 24F
那我問一個和程式無關的問題,就是有時候我的pcman也會跑
04/06 12:19, 24F

04/06 12:20, , 25F
出那一個對話窗,說是應用程式出問題,按下確定後
04/06 12:20, 25F

04/06 12:20, , 26F
你的pcman就關掉了!!
04/06 12:20, 26F

04/06 12:21, , 27F
這是我pcman本身的問題嘛?
04/06 12:21, 27F

04/06 13:26, , 28F
還滿靈異的 為什麼你可以把我的pcman關掉
04/06 13:26, 28F

04/06 13:28, , 29F
沒寫好 用到不該用的記憶體?
04/06 13:28, 29F
文章代碼(AID): #19sE0mkE (C_and_CPP)
文章代碼(AID): #19sE0mkE (C_and_CPP)