プロが教えるわが家の防犯対策術!

学校でC言語を勉強しています。(まだ初心者です)
テストの成績を入力して、その結果を降順にソートしたいんですけど、
下記のプログラムでは、正常に動かないです。

struct seiseki {
char nama;
int sansuu;
int rika;
int goukei;
};
~~~~~~~~~~~~~~~~~~~~
struct seiseki class_a;
struct seiseki class_b;
struct seiseki *ptr1;
struct seiseki *ptr2;

ptr1 = class_a;
ptr2 = class_b;
~~~~成績はあらかじめ入力済み~~~~
sout(class_a, 3);
sout(class_b, 3);

void sout(struct seiseki *p, int num)
{
struct seiseki temp;
int count;
int j;

for (count = 1; num > count; count++) {
temp = p[count];
for (j = count; j > 0 && p[j - 1].goukei < temp.goukei; j--) {
p[j] = p[j - 1];
}
p[j] = temp;
p++;
}
}
class_aだけを実行するプログラムだとちゃんと表示されますが、
一度でclass_aとclass_bを実行するプログラムだと表示がおかしくなります。
どなたか教えてください。

A 回答 (3件)

>p++;


基準の位置を動かしているからダメなんじゃないですか
この行を削除してみたら
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。
ずばりその通りでした。
ありがとうございました。

お礼日時:2005/11/23 18:30

色々とわからんところがありますが、


class_aとclass_bは配列ですよね。
だったら
struct seiseki class_a[3];
struct seiseki class_b[3];
とすべきなんじゃ

この回答への補足

ご返答ありがとうございます。
書きもれていました。
実際のプログラムでは書いてました、、、すいません、、、
ソート関数での中で、class_aとclass_bがまざって表示されてしまうんです。

補足日時:2005/11/23 15:37
    • good
    • 0

sout()第二実引数の「3」ってのが、うさんくさいですが、それよりも、class_aとclass_bが連続したメモリ領域に確保されている事を前提としてそうなのが、とても危険と思われます。


リンカがそういう配置を行う保証はありませんので。

最初から配列として処理するように書いた方が良いかと。
sout()のなかで、p[]と書いてるので、配列については知っているのでしょうから。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2005/11/23 18:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!