ダメージ計算関数のテストをしてみたんですが、実行結果がおかしかったのデバックビルドをしたら、変数damage_seed(ダメージ計算の素となる値)がスクリーンショットの通り、おかしな値になっていました。
どこが問題なのか教えてください。
実行環境は、Visual Studio Community 2015です。
すごく初歩的な部分なんですが、よろしくお願いします。
int damage(int hit_probability, int critical_probability, int attack_level, int attack, int defence) {
/*
第1引数:攻撃のヒット率
第2引数:クリティカル率
第3引数:攻撃する人のレベル
第4引数:攻撃する人の攻撃力
第5引数:攻撃される人の守備力
*/
int damage_seed = attack - defence + random(attack_level, 0);
if (damage_seed <= 0 && judgement(50)) damage_seed = 1;
else damage_seed = 0;
if (!judgement(hit_probability)) damage = 0;
else if (judgement(critical_probability)) return static_cast<int>(((damage_seed)* 3 >> 2) + (1 >> 2));
else return damage_seed;
}
int main(void) {
int hp = 150;
hp -= damage(100, 10, 15, 155, 100);
std::cout << hp << std::endl;
}
他にも攻撃が当たるかやクリティカルが発生するかを判定するjudgement関数(bool型/引数:確率)と、乱数を返すrandom関数(int型/第1引数:乱数の最大値 第2引数:乱数の最小値)が存在しますが、そこには問題はなかったので省略しました。
No.2ベストアンサー
- 回答日時:
#1 の最後で指摘してされている点はどちらもエラーですな. ポインタ変数に 0 を代入するのは OK だけど, 関数名から変換されたポインタ値に代入するのはさすがにアウト. あと, 値を返す (つまり返り値の型が void でない) 関数は, main を除いて返り値を伴う return の実行が必須 (main だけは「return を実行しなかったら関数の最後に return 0; という文があるものとみなす」ことになっている).
以下おまけ:
まず, 「judgement」は関数名としてどうなんだろうか. 判定して bool値を返すのはいいけど, この名前から「どういうときに true を返してどういうときに false を返すのか」は読み取れないねぇ. この手の「ひどい名前」は有名なソフトウェアでも見かけることがある (そしてときどきバグが混入している) んだけど, やっぱり気を付けた方がいいと思うな.
それから
return static_cast<int>(((damage_seed)* 3 >> 2) + (1 >> 2));
の部分は
・damage_seed になぜ括弧をつけているのか
・1>>2 の結果は 0 だから加算の意味がない
・右辺はそもそも int なので static_cast が完全に余計
と, 無駄だらけ. ついでにいうとこの計算結果が damage_seed より小さいことに気づいてる?
damage = 0部分は、前の関数名の時にあった変数が残ってただけです。すいません。
static_castの部分はクリティカルヒット時のダメージ計算を行う部分なんですが、出てくる値に問題があったので変えました。
damage_seedが括弧で囲まれてるのはミスです。すいません。
そして原因は#1の方へのお礼のところにも書きました通り、3行目のelse文でした。
ありがとうございました。
No.1
- 回答日時:
>スクリーンショットの通り、おかしな値になっていました。
それを確認したのは、どの位置にブレークポイント設定した時ですか?
>int damage_seed = attack - defence + random(attack_level, 0);
の行であれば、後に書かれた計算式の処理前なので不定値が入っているのは正常です。
-858993460を16進数にすると0xCCCCCCCCなので…VC系のデバッグビルド時の未初期化ローカル変数としては正常な値でしょう。
# VCのデバッグビルドでは未初期化のローカル変数は0xCCで埋められます。
# よく文字列を表示してみたら最後に”フフフフフフフフ”って続くんですけどなんでしょう?とか書かれることがありますが。
# 「VC デバッグビルド 0xCC」辺りで検索して見てくださいな。
# リリースビルドだと本当に不定値が入っています。実行するたびに値が変わる可能性が高いですね。
んで…いろいろ端折っているのかも知れませんが、上記のdamage()にはおかしいところがあります。
インデントが見にくいので整形すると……
>int damage(int hit_probability, int critical_probability, int attack_level, int attack, int defence) {
> /*
> 略
> */
> int damage_seed = attack - defence + random(attack_level, 0);
> if (damage_seed <= 0 && judgement(50))
> damage_seed = 1;
> else
> damage_seed = 0;
>
> if (!judgement(hit_probability))
> damage = 0;
> else if (judgement(critical_probability))
> return static_cast<int>(((damage_seed)* 3 >> 2) + (1 >> 2));
> else
> return damage_seed;
>}
if (!judgement(hit_probability))
damage = 0;
で、関数ポインタに0を代入(?)しています。
ビルド通るんですか?
で、この条件以外ではreturnで値を返却していますが、このルートに入ると戻り値なしで関数抜けます。
# ビルド時にエラーになっていませんかね?
damage = 0
ここはreturn 0です。
元の関数の名前がdamage_calcで、その中にdamageっていう変数があったのがそのままになってました。すいません。
あと、処理の3行目のelse文が原因で、damage_seedが0にされてました。
スクリーンショットの件は、ブレークポイントの位置を間違えていたことが原因でした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 3 2022/11/09 13:27
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
最早開始時間と最遅完了時刻を...
-
C言語
-
複数桁10進数の*桁目だけを抽出...
-
C言語の配列をC++のvectorに高...
-
ラップ関数とはどんなものですか?
-
DirectX ~テクスチャに値を書...
-
windows-findstrの正規表現を使...
-
PowerShellがうまくいかない
-
(int *)の意味
-
エラー 添字が付けられた値が、...
-
C言語 エラーの原因がわからな...
-
VB6でAddressOfを使った良いサ...
-
C#のコンパイルエラーCS0120に...
-
商と剰余を同時に求める(C言語)
-
C言語でDxlibを使って3x3の奇数...
-
各桁の和を返す関数
-
【C言語】関数へのポインタ渡し
-
ファイルに含まれるアルファベ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
ColorをRGBで指定する方法
-
(int *)の意味
-
足して100になるような乱数のア...
-
シェルピンスキーのギャスケット
-
if と配列の組み合わせ
-
実数の整数部,小数部の取得
-
構造体の勉強中です 合計点の高...
-
「{ } で囲むだけ」は正しい?
-
c言語の配列を使ってサイコロを...
-
式は定数値が必要です」という...
-
acceptをalarmでタイムアウトさ...
-
read関数をノンブロッキングで...
-
std::set<int> で、ある値が何...
おすすめ情報