作者wheredo (吹泡泡小雞)
看板C_and_CPP
標題[問題] qsort的一些問題
時間Mon Apr 6 00:45:35 2009
這是部分程式碼,不過我編譯時,就是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
1F:推 snowlike:靜態陣列宣告能那麼大?再來compare的return值是交換依據 04/06 00:56
2F:→ snowlike:沒看到return 1,-1的部份  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄請忽略QQ 04/06 01:00
3F:推 sunneo:如果宣告/定義在全域變數的 會反應在檔案大小 04/06 01:06
4F:→ wheredo:這樣我要怎樣修改勒?靜態陣列好像沒有那麼大吼~ 04/06 01:07
5F:→ wheredo:呃....snowlike大大你講的後面那一句,我不懂欸? 04/06 01:10
6F:推 sunneo:因為sizeof(student) != sizeof(Student) 04/06 01:10
7F:→ sunneo:大小寫錯了 04/06 01:10
8F:→ sunneo:且1 * sizeof(student) == student_size * sizeof(Student) 04/06 01:11
9F:→ wheredo:不過Student他不是一個型別嘛?我上面有寫一個struct 04/06 01:13
10F:→ wheredo:我寫這樣算個數應該不會有錯吧,不過他執行就是會有錯 04/06 01:13
11F:推 sunneo:當然是型別啊... qsort需要的參數是(陣列,個數,元素大小) 04/06 01:13
12F:→ sunneo:sizeof(Student) 才是單一個Student物件的大小 04/06 01:13
13F:→ sunneo:sizeof(student)得到的是 3328個Student物件的大小 04/06 01:14
14F:→ sunneo:如果你填student_size,sizeof(student) 04/06 01:14
15F:→ sunneo:那會是3328個 (3328個Student) 的Student物件大小 04/06 01:15
16F:→ sunneo:也就是3328 * 3328 * sizeof(Student) 04/06 01:15
17F:→ wheredo:謝謝!我懂了 04/06 01:15
18F:→ sunneo:與你原本想表達的"對3328個Student物件排序"的意思差多了 04/06 01:15
19F:→ sunneo:不過原來我剛剛一直看錯啊...是3388 不是3328 04/06 01:16
20F:→ snowlike:呵感謝解答,後面那句是以為myCompare只有return 0的意思 04/06 01:22
21F:→ wheredo:只有return 0的意思? 04/06 01:26
22F:→ wheredo:不是有一堆的if嘛? 04/06 01:27
23F:→ snowlike:so 二樓才那樣說 04/06 01:33
24F:→ wheredo:那我問一個和程式無關的問題,就是有時候我的pcman也會跑 04/06 12:19
25F:→ wheredo:出那一個對話窗,說是應用程式出問題,按下確定後 04/06 12:20
26F:→ wheredo:你的pcman就關掉了!! 04/06 12:20
27F:→ wheredo:這是我pcman本身的問題嘛? 04/06 12:21
28F:→ henry666666:還滿靈異的 為什麼你可以把我的pcman關掉 04/06 13:26
29F:→ henry666666:沒寫好 用到不該用的記憶體? 04/06 13:28