• ベストアンサー

構造体を使ったプログラム

学校で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を実行するプログラムだと表示がおかしくなります。 どなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>p++; 基準の位置を動かしているからダメなんじゃないですか この行を削除してみたら

moncyasan
質問者

お礼

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

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

色々とわからんところがありますが、 class_aとclass_bは配列ですよね。 だったら struct seiseki class_a[3]; struct seiseki class_b[3]; とすべきなんじゃ

moncyasan
質問者

補足

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

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

sout()第二実引数の「3」ってのが、うさんくさいですが、それよりも、class_aとclass_bが連続したメモリ領域に確保されている事を前提としてそうなのが、とても危険と思われます。 リンカがそういう配置を行う保証はありませんので。 最初から配列として処理するように書いた方が良いかと。 sout()のなかで、p[]と書いてるので、配列については知っているのでしょうから。

moncyasan
質問者

お礼

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