C言語の館のソースのある部分ができない・わからない(2)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cupa
記事: 117
登録日時: 2年前

C言語の館のソースのある部分ができない・わからない(2)

#1

投稿記事 by cupa » 2年前

度々失礼します。

C言語の館(26. シューティング基本)のソース書き写してやっているのですが、
動作しません。

画像のファイルパスなども確認したのですが、大丈夫でした。

また、書き間違えをしたのかな?と思い、コピペで試してみたのですがダメでした。

実際には、ウィンドウは表示されるのですが何も表示されません。

毎度お願いします。


prog
記事: 9
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#3

投稿記事 by prog » 2年前

コード:

        LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
                                
        while(1){

"26. シューティング基本"のプログラムの中のこちらの while(1){ の行にブレークポイントを置いて(while(1){ の行にカーソルを移動してF9キーを押す)実行(F5キーを押す)して、ブレークしたら配列imageに-1以外の値が格納されているか確認してみてください。
-1が格納されていたら画像が正常に読み込まれていません。
(その場合、画像が読み込まれていないので何も画面に表示されないということになります)

cupa
記事: 117
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#4

投稿記事 by cupa » 2年前

すみません。
普段はVSを使わない(重いので)ので今回だけ使用してみたのですが、
ブレークポイントを作った後にどうやって確認すればいのでしょうか?

コード:

DrawFormatString(0,0,GetColor(255,255,255),"%d",image);
このようにしてみたのですが変な値が出てダメでした。
また、いつのタイミングに呼べばいいのでしょうか?

whileの前か後か・・・この機能を使ったことがなかったので使い方がわかりません・・・
お定数かけますがよろしくおねがいします

prog
記事: 9
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#5

投稿記事 by prog » 2年前

ブレークした状態でVSのメニューから
[デバッグ(D)]->[ウィンドウ(W)]->[ローカル(L)]
を選択するとローカル変数のブレークした時点での値の一覧が表示されますので、その中のimage配列を見ると配列要素の値を確認することができます。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語の館のソースのある部分ができない・わからない(2)

#6

投稿記事 by みけCAT » 2年前

cupa さんが書きました:
2年前

コード:

DrawFormatString(0,0,GetColor(255,255,255),"%d",image);
このようにしてみたのですが変な値が出てダメでした。
imageは配列のはずなので、それぞれの要素を出力しないとダメですね。
例えば↓

コード:

for (int color = GetColor(255, 255, 255), i = 0; i < 16; i++) {
	DrawFormatString(20 + 300 * (i / 8), 50 + 30 * (i % 8), color, "image[%d] = %d", i, image[i]);
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cupa
記事: 117
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#7

投稿記事 by cupa » 2年前

思いですが、progさんが教えてくださった方法をやってみました。
そしたら

コード:

image	0x000000b9a32ff820 {67633153, 67895298, 68157443, 68419588, 68681733, 68943878, 69206023, 69468168, ...}	int[16]
このようなものが入ってました・・・(一番はじめのは多分16進数だと思うのですが、変換しても波括弧の中と同じような桁が多い数でした)

みけCATさんのやりかたでも、波括弧に入っている値が出力されました。

prog
記事: 9
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#8

投稿記事 by prog » 2年前

載せていただいた値を拝見する限りではロードは成功しているようです。
(最初の16進数はimage配列が格納されているメモリアドレスです、波括弧の中が配列要素の値で、67633153 や 67895298 などはグラフィックハンドルの値です)

もしかしてプログラムは問題なく動作しているのではないでしょうか?
手元で試してみたのですが、このプログラムは起動しただけでは真っ暗の画面で何も表示されません。
”エンターキーを押すとchar.pngの画像が画面下から上に飛んでいく”というプログラムなので、プログラムを起動した後にエンターキーを押してみてください。

cupa
記事: 117
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#9

投稿記事 by cupa » 2年前

すみません、そのようでした。お手数おかけして申し訳ございませんでした。
ありがとうございます。

追加でもう一つ質問よろしいでしょうか?

コード:

else if( Key[ KEY_INPUT_RETURN ]  == 1 ){//5カウント以上たっていたら
                        counter=0;                       //カウンターを戻す
                        for(i=0;i<10;i++){             
                                if(tama[i].flag==0){     //発射していない玉を探し、
                                        tama[i].flag=1;  //発射フラグを立てる
                                        break;
                                }
                        }
                }
ここで、breakしてると思うのですが、何故でしょうか?
また、この場合抜けるのはFOR文ですよね?While文は抜けないですよね?
0番目の弾のフラグが0だった場合、他の弾はみられず後は飛ばされるのではないのでしょうか?
よろしくおねがいします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語の館のソースのある部分ができない・わからない(2)

#10

投稿記事 by みけCAT » 2年前

cupa さんが書きました:
2年前
この場合抜けるのはFOR文ですよね?While文は抜けないですよね?
はい。
cupa さんが書きました:
2年前
0番目の弾のフラグが0だった場合、他の弾はみられず後は飛ばされるのではないのでしょうか?
飛ばされます。
cupa さんが書きました:
2年前
ここで、breakしてると思うのですが、何故でしょうか?
最初に見つかった空き枠1個だけを利用し、弾を1個だけ出すためですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cupa
記事: 117
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#11

投稿記事 by cupa » 2年前

もしエンターが長押しされたときは、i番目(0,1,2,3,4,5,6,,,)のフラグがどんどん立っていくのでしょうか?
一番はじめの0番目が1になって次の処理で0に戻してるのでずっと0番目でループしているのではないのか、
と思うのですがどうでしょうか・・・

みけCATさん>最初に見つかった空き枠1個だけを利用し、弾を1個だけ出すためですね。

空き枠を、一つだけしか利用しないのなら、配列にする必要はないのではないでしょうか?
エンターが推し続けられた場合、どうなるのかがよくわかってなくて・・・

prog
記事: 9
登録日時: 2年前

Re: C言語の館のソースのある部分ができない・わからない(2)

#12

投稿記事 by prog » 2年前

> もしエンターが長押しされたときは、i番目(0,1,2,3,4,5,6,,,)のフラグがどんどん立っていくのでしょうか?
はい

> 一番はじめの0番目が1になって次の処理で0に戻してるのでずっと0番目でループしているのではないのか
tama.flag=0; が実行される条件は上の行の if(tama.y < -32) が成立した場合(画像が画面上端から見えなくなった場合)ですので、0番目しか使用されない、ということはありません。

試しに

コード:

tama[i].flag=1;  //発射フラグを立てる

こちらの行にブレークポイントを置いてプログラムを実行して、エンターキーを押してみてください。
上記の行でプログラムが止まったら、F10キーを押して1行づつプログラムを実行してみてください。

コード:

tama[i].flag=0;   //発射フラグを戻す

tama.flag=1;を実行した直後ではこちらの行には処理が辿り着かないことが確認できると思います。

返信

“C言語何でも質問掲示板” へ戻る