作者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