• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クイックソートの可視化プログラムを考えています)

クイックソートの可視化プログラムを考えています

このQ&Aのポイント
  • OpenGLを用いてソートされた整数配列を可視化するプログラムを作成しています。
  • 要素ごとに四角形で表現し、数が大きいほど明るくなるように設定しています。
  • ソーティングをワンステップずつ進めていく様子を表示させたいです。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

このプログラムの構造で volatile を付けても, まあダメでしょうね (付けた方が安全ではあるんだけど). おそらく (#4 にある) 「キーイベントをちゃんと取れて」 という前提がなりたっていないと思います. 一般的なイベントドリブンシステムでは イベントをとってくる→適切な関数を呼び出す という処理を繰り返します (メインループ). で, このプログラムではキーボードコールバック関数の中でソートをしているので, そのソートが終わらない限りキーボードコールバック関数からメインループに制御が戻ることはありません. 従ってイベント処理もしません. ところが, イベント処理をしないと flag の値が 1 にならないため while のところでループしてしまい, ソート処理が終わらないことになっています. よ~するにデッドロックをおこしちゃっています. スレッド使えばなんとかなるかもしれんけど, 保証はしない.

nun00nun
質問者

お礼

お礼が遅くなってしまいまして申し訳ございません。 丁寧な解説感謝いたします。 プログラムの組み方を変えることによって無事解決いたしました。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • ponta1971
  • ベストアンサー率30% (361/1191)
回答No.4

うぉっ・・・、恥をさらしただけでしたね・・・。 >while (flag == 0) glutPostRedisplay(); (※flagはRキーを押した場合に1となる) というコードを付け加えた場合、1ループごとに再描画されず、表示が初期状態のまま、いつまでも動かないという状況です。 キーイベントをちゃんと取れて、flagが1になってる前提でですが、ループしまくって処理が溜まりRキーを押した処理まで行っていないなんてことはないでしょうか。 タイマーとかでウェイトをかけて1秒に4回とかループ回数を制御してみてはどうでしょうか。

nun00nun
質問者

お礼

お礼が遅くなってしまいまして申し訳ございません。 親身に回答してくださり感謝です。 プログラムの組み方を変えることによって無事解決いたしました。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

OpenGL は知らんけど, 一般的なイベントドリブンシステムでこんなことしたら flag が 1 にならない よね. ひょっとしたら flag の定義を volatile int flag = 0; に変えればいいのかなぁ... でもダメだろうなぁ....

nun00nun
質問者

お礼

続けてのご回答ありがとうございます。 提案していただいた方法を試してみたのですが、Tacosanさんの予想通り、やはり変わらずといった感じでした。 flagをねじ込もうという方針がそもそもいけないのですね……。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

えぇっと, C ではそんなことにならないんですが>#1. ちなみに, どう「うまくいかない」んでしょうか?

nun00nun
質問者

お礼

ご回答、ありがとうございます。

nun00nun
質問者

補足

説明不足で大変失礼いたしました。ponta1971さんの回答に捕捉させていただいたとおりの状況となっております。申し訳ございません。

すると、全ての回答が全文表示されます。
  • ponta1971
  • ベストアンサー率30% (361/1191)
回答No.1

ざっとしか見ていないのですが・・・。 >pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */ このぶぶんって、現在の状態だと pivot = x[24.5]; このような状態になって値が取れないってことはないですか? 「(left + right) / 2」この値をさらに切り上げる処理が必要なのではないでしょうか。

nun00nun
質問者

お礼

ご回答、ありがとうございます。

nun00nun
質問者

補足

言葉足りずで申し訳ございません。 クイックソートの部分のみで実行すると、正常に動作することが確認できております。 しかし、上記のとおり関数QSortの途中に while (flag == 0) glutPostRedisplay(); (※flagはRキーを押した場合に1となる) というコードを付け加えた場合、1ループごとに再描画されず、表示が初期状態のまま、いつまでも動かないという状況です。 再描画要求をする位置が良くないのでしょうか……。

すると、全ての回答が全文表示されます。

関連するQ&A