ページ 1 / 1
新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 18:48
by ねんどじん
3.3章のサンプルプログラムをC++で書こうとしたところ、添付したコードができましたが、
Ctrl+f5を押しても真っ黒な画面が出てきてすぐ消える、という挙動になってしまいました。
コンパイル時にエラーが出ないのでどう解決すればいいかがよくわからないのですが、
何が問題でこのような挙動になってしまっているのでしょうか?
また、今後このような問題が起きた時の解決するための方針も合わせて教えていただけると大変助かります。
よろしくお願いします。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 18:53
by ねんどじん
ファイルサイズが大きすぎるのか、添付に失敗したようなので、以下にうpしておきます。
重ね重ねよろしくお願いします。
http://www.dotup.org/uploda/www.dotup.o ... 8.zip.html
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 19:08
by Dixq (管理人)
まず、.sdfファイルやDebugフォルダは不要な上に重いので削除してアップしましょう。
menu_elementのchar* m_nameの領域を確保せずにコピーしようとして落ちてるのではないですか?
確認はしていませんが、ブレイクポイントで一行ずつ見て行けばどこで落ちているか分かりますよ。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 19:42
by ねんどじん
>まず、.sdfファイルやDebugフォルダは不要な上に重いので削除してアップしましょう。
了解しました。
>menu_elementのchar* m_nameの領域を確保せずにコピーしようとして落ちてるのではないですか?
>確認はしていませんが、ブレイクポイントで一行ずつ見て行けばどこで落ちているか分かりますよ。
はい、m_nameの領域をmenu_elementのコンストラクタで確保したところ、どうやら問題は解決したようです。ありがとうございました。
ただ、Ctrl+f5で起動するとまた別の問題が起きたのか、エラーメッセージが出てプログラムが落ちてしまいます。
ブレイクポイントを使ってみた結果、
int white=GetColor(255,255,255);
と書いた時に、なぜかwhiteに-1が代入されているようだと分かりました。
GetColorのリファレンスも見てみたのですが、いまいちこの問題(whiteになぜか-1が代入される)の原因と解決策がわかりません。
どなたか今一度コードを確認していただけないでしょうか。
以下に上げ直しました。
http://www.dotup.org/uploda/www.dotup.o ... 1.zip.html
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 20:57
by softya(ソフト屋)
-1で支障がありますか? 環境で戻り値が変わるので-1 で多分大丈夫だと思うんですが。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 21:23
by ねんどじん
>-1で支障がありますか? 環境で戻り値が変わるので-1 で多分大丈夫だと思うんですが。
そうだったのですか。-1で大丈夫なら安心なのですが、それだと自分には
なぜこのソリューションをCtrl+f5でビルド(?)した時に強制終了するのかさっぱりわからなくなります。
ブレークポイントを配置してf5でデバッグしてみたんですが、今度は何も問題なさげに予定された通りの動きをしていました。
何が問題でCtrl+f5した際に強制終了してしまうのか、教えていただけませんか。
もう正直自分の手には負えなくなっています。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 22:01
by softya(ソフト屋)
m_name=new char;だとstrcpyする領域としては必要なサイズとか考慮されていないので大問題ですね。ポインタの勉強をされたほうが良いと思います。
動いていたのはたまたまだと思います。
C++なのでstd::stringクラスを使ったほうが良いんですが、ポインタも勉強しておくべきだと思います。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 22:25
by ねんどじん
返信ありがとうございます。一度ポインタの勉強をし直してからチャレンジし直したいと思います。
はじめはstringを使っていたのですが、DrawFormatStringにstring型で文字列を渡せないという問題が起こったので途中で
char*型に書き直しました。
DrawFormatstringにstring型の文字列を引数として渡す方法があるのでしょうか?
それともDrawFormatStringにstring型の文字列を渡す場合はchar*型にキャストしなければいけないのでしょうか?
自分の技術レベルが根本的に足りてないということなので、これでこのトピックは一度解決扱いにしようと思います。
しかし上記に答えられる方は是非お願いします。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 22:42
by softya(ソフト屋)
c_str()メンバ関数でconst char* constポインタは得られます。
クラスのインスタンスをchar*型にキャストは出来ません。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 23:08
by ねんどじん
返信ありがとうございます。c_str()については今知りました。やはりもう一度C++を学習し直さなければと思いました。
そうですよね、stringをchar*にキャストできたら変ですもんね、DrawFormatStringにstringを渡す方法がわからなくて混乱してました。
何度も回答してくださってありがとうございました。ではおやすみなさい。
Re: 新・ゲームプログラミングの館3.3章「簡単な選択画面を作る」でつまづいてしまいました
Posted: 2013年7月12日(金) 23:12
by softya(ソフト屋)
ねんどじん さんが書きました:返信ありがとうございます。c_str()については今知りました。やはりもう一度C++を学習し直さなければと思いました。
そうですよね、stringをchar*にキャストできたら変ですもんね、DrawFormatStringにstringを渡す方法がわからなくて混乱してました。
何度も回答してくださってありがとうございました。ではおやすみなさい。
オーバーロードすれば(const char * const)は出来ると思いますが、 stringは
対応定義していなかったはずだと思います(完全に自信がない・・・)。
自分で継承して作るのも方法です。