- ベストアンサー
構造体を使ったプログラム
学校で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を実行するプログラムだと表示がおかしくなります。 どなたか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>p++; 基準の位置を動かしているからダメなんじゃないですか この行を削除してみたら
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
色々とわからんところがありますが、 class_aとclass_bは配列ですよね。 だったら struct seiseki class_a[3]; struct seiseki class_b[3]; とすべきなんじゃ
補足
ご返答ありがとうございます。 書きもれていました。 実際のプログラムでは書いてました、、、すいません、、、 ソート関数での中で、class_aとclass_bがまざって表示されてしまうんです。
- osamuy
- ベストアンサー率42% (1231/2878)
sout()第二実引数の「3」ってのが、うさんくさいですが、それよりも、class_aとclass_bが連続したメモリ領域に確保されている事を前提としてそうなのが、とても危険と思われます。 リンカがそういう配置を行う保証はありませんので。 最初から配列として処理するように書いた方が良いかと。 sout()のなかで、p[]と書いてるので、配列については知っているのでしょうから。
お礼
ご返答ありがとうございました。
お礼
ご返答ありがとうございました。 ずばりその通りでした。 ありがとうございました。