質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

2回答

1359閲覧

特定の作業をするとデバッグなしで突然消えてデバッグありでフリーズしてしまう

Tger

総合スコア2

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2021/11/07 13:47

編集2021/11/07 13:50

![イメージ説明]

詳細

以下のプログラムにしたところ、図のように、「何でもアイテム」を選択すると、デバッグなしで実行した場合、突然消えて、デバッグありで実行すると、フリーズしてしまいます。
選択するプログラムは異常がありませんでしたが、その後の攻撃・回復の演出でバグが発生しているようです。
具体的に何が悪いのですか?問題の改善方法も教えてください!
ちなみに、〇〇は、半角40文字以内です。

#問題が発生するプログラム
x,y,○○x,○○yは常に1920以下

#include "DxLib.h" #include "string.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { … SetGraphMode(1920, 1080, 32); … --- aitemu: if (omake > 10) { if (mymoney < 1000000) { goto mytarn; } mymoney = mymoney - 1000000; } else if (omake > 0) { if (mymoney < 30000) { goto mytarn; } mymoney = mymoney - 30000; } else { if (mymoney < 300) { goto mytarn; } mymoney = mymoney - 300; } --- loop = 0; x = 960; y = 905; z = 0; gazouax = 920; gazouay = 800; gazoubx = 920; gazouby = 150; m = GetRand(100); if (m > 95) { n = tekifullhp; sphit = 2; } else if (m > 80) { n = tekifullhp * 0.7; sphit = 1; } else if (m > 60) { n = tekifullhp * 0.5; } else if (m > 5) { n = tekifullhp * 0.3; } else { n = 0; } tekihp = tekihp - n; score = score + n; if (score > 999999999) { score = 999999999; } if (tekihp < 0) { tekihp = 0; } p = 255; q = 128; hp = fullhp; mp = fullmp; if (omake > 0) { muteki = muteki + 4; } else { muteki = muteki + 11; } maebar = thpbar; if (tekifullhp > 1000000) { thphozon = tekihp / 10000; fullthphozon = tekifullhp / 10000; thphozon = thphozon * 1920; hozonti = thphozon / fullthphozon; barhozon = hozonti; } else { thphozon = tekihp; fullthphozon = tekifullhp; thphozon = thphozon * 1920; hozonti = thphozon / fullthphozon; barhozon = hozonti; } barminus = thpbar - barhozon; barminus = barminus / 100; barminus = barminus + 1; maebar2 = hpbar; if (fullhp > 1000000) { hphozon = hp / 10000; fullhphozon = fullhp / 10000; hphozon = hphozon * 1920; hozonti = hphozon / fullhphozon; barhozonplus = hozonti; } else { hphozon = hp; fullhphozon = fullhp; hphozon = hphozon * 1920; hozonti = hphozon / fullhphozon; barhozonplus = hozonti; } barplus = barhozonplus - hpbar; barplus = barplus / 100; barplus = barplus + 1; maemp = mpbar; if (fullmp > 1000000) { mphozon = mp / 10000; fullmphozon = fullmp / 10000; mphozon = mphozon * 1920; hozonti = mphozon / fullmphozon; mpbarhozon = hozonti; } else { mphozon = mp / 10000; fullmphozon = fullmp / 10000; mphozon = mphozon * 1920; hozonti = mphozon / fullmphozon; mpbarhozon = hozonti; } mpplus = mpbar - mpbarhozon; mpplus = mpplus / 100; mpplus = mpplus + 1; for (loop = 0; loop < 64; loop++) { ClearDrawScreen(); DrawGraph(gazouax, gazouay, gazoua, TRUE); a = station % 5; if (a == 0) { DrawGraph(gazoubx, gazouby, gazouc, TRUE); } else if (omake > 0) { DrawGraph(gazoubx, gazouby, gazouc, TRUE); } else { DrawGraph(gazoubx, gazouby, gazoub, TRUE); } if (muteki > 0) { for (mutekiloop = 0; mutekiloop < 500; mutekiloop++) { mutekicolor = GetColor(GetRand(256), GetRand(256), GetRand(256)); DrawPixel(gazouax + GetRand(80), gazouay + GetRand(150), mutekicolor); } } gazouay = gazouay - 2; if (fullhp > 1000000) { hphozon = hp / 10000; fullhphozon = fullhp / 10000; hphozon = hphozon * 1920; hozonti = hphozon / fullhphozon; hpbar = hozonti; } else { hphozon = hp; fullhphozon = fullhp; hphozon = hphozon * 1920; hozonti = hphozon / fullhphozon; hpbar = hozonti; } if (tekifullhp > 1000000) { thphozon = tekihp / 10000; fullthphozon = tekifullhp / 10000; thphozon = thphozon * 1920; hozonti = thphozon / fullthphozon; thpbar = hozonti; } else { thphozon = tekihp; fullthphozon = tekifullhp; thphozon = thphozon * 1920; hozonti = thphozon / fullthphozon; thpbar = hozonti; } if (fullmp > 1000000) { mphozon = mp / 10000; fullmphozon = fullmp / 10000; mphozon = mphozon * 1920; hozonti = mphozon / fullmphozon; mpbar = hozonti; } else { mphozon = mp; fullmphozon = fullmp; mphozon = mphozon * 1920; hozonti = mphozon / fullmphozon; mpbar = hozonti; } DrawBox(0, 5, thpbar, 10, barcolor, TRUE); DrawBox(0, 1070, maebar2, 1075, hpc, TRUE); Rs = Rs - 3; if (Rs < 0) { Rs = 255; } wazukacolor = GetColor(128, 0, Rs); if (mpatai <= 20) { DrawBox(0, 1060, maemp, 1065, wazukacolor, TRUE); } else { DrawBox(0, 1060, maemp, 1065, mpcolor, TRUE); } DrawBox(maemp, 1060, mpbar, 1065, kaifukucolor, TRUE); DrawBox(thpbar, 5, maebar, 10, damagecolor, TRUE); DrawBox(maebar2, 1070, hpbar, 1075, kaifukucolor, TRUE); SetFontSize(24); DrawFormatString(1300, 900, scorecolor, "%sさん\nscore %d\nハイスコア %sさん\nscore %d", name, score, champion, HiScore); SetFontSize(48); WaitTimer(5); } for (loop = 0; loop < 127; loop++) { if (gazouay < 800) { gazouay = gazouay + 2; } ClearDrawScreen(); DrawGraph(gazouax, gazouay, gazoua, TRUE); a = station % 5; if (a == 0) { DrawGraph(gazoubx, gazouby, gazouc, TRUE); } else if (omake > 0) { DrawGraph(gazoubx, gazouby, gazouc, TRUE); } else { DrawGraph(gazoubx, gazouby, gazoub, TRUE); } if (muteki > 0) { for (mutekiloop = 0; mutekiloop < 500; mutekiloop++) { mutekicolor = GetColor(GetRand(256), GetRand(256), GetRand(256)); DrawPixel(gazouax + GetRand(80), gazouay + GetRand(150), mutekicolor); } } z = z + 1; maebar = maebar - barminus; if (thpbar > maebar) { maebar = thpbar; } maebar2 = maebar2 + barplus; if (hpbar < maebar2) { maebar2 = hpbar; } maemp = maemp + mpplus; if (mpbar < maemp) { maemp = mpbar; } draw = 0; color = GetColor(0, 255, 255); for (draw = 0; draw < 100; draw++) { DrawPixel(gazouax + GetRand(80), gazouay + GetRand(150), color); } color = GetColor(255, 128, 0); DrawCircle(960, 225, z, color, TRUE); p = p - 2; q = q - 1; if (n <= 0) { color = GetColor(0, p, p); DrawString(1100, 150 - 32, "アタック失敗!!", color); } else if (sphit == 1) { color = GetColor(p, 0, p); DrawFormatString(1100, 150, color, "%d", n); } else if (sphit == 2) { color = GetColor(q, q, 0); DrawFormatString(1100, 150, color, "%d", n); } else { color = GetColor(p, q, 0); DrawFormatString(1100, 150, color, "%d", n); } color = GetColor(128, 255, 0); DrawCircle(x, y, z, color, TRUE); color = GetColor(0, p, 0); DrawString(600, 760 - 32, "無敵モード発動!", GetColor(255, 201, 14)); DrawString(600, 820 - 32, "たくさん回復!!", color); DrawBox(0, 5, thpbar, 10, barcolor, TRUE); DrawBox(0, 1070, maebar2, 1075, hpc, TRUE); Rs = Rs - 3; if (Rs < 0) { Rs = 255; } wazukacolor = GetColor(255, 0, Rs); if (mpatai <= 20) { DrawBox(0, 1060, maemp, 1065, wazukacolor, TRUE); } else { DrawBox(0, 1060, maemp, 1065, mpcolor, TRUE); } DrawBox(maemp, 1060, mpbar, 1065, kaifukucolor, TRUE); DrawBox(thpbar, 5, maebar, 10, damagecolor, TRUE); DrawBox(maebar2, 1070, hpbar, 1075, kaifukucolor, TRUE); SetFontSize(24); DrawFormatString(1300, 900, scorecolor, "%sさん\nscore %d\nハイスコア %sさん\nscore %d", name, score, champion, HiScore); SetFontSize(48); WaitTimer(5); }

発生している問題・エラーメッセージ

特にエラーメッセージはなく、テストの実行をすると、たまに以下のメッセージが一番下に表示される。
予期しないエラーが検出されました。詳細については、テスト出力ペインを確認してください。

該当のソースコード

C++

DxLib

試したこと

水平線内は正常に動いたので、その後のプログラムをちょこちょこと変えた。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2022 RCでプログラム
バージョンは最新

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

プログラムが落ちる、止まるなんてC/C++の(間違った)プログラムでは容易に起こる話ですね。

先にひとこと。プログラムを関数に分けて整理することを早い段階で覚えてください。一般に、数百行におよぶ関数なんて他人に読ませるものではありません。

で、プログラムを省略しているようですが、省略した部分に問題の原因がないとどうして言えるのでしょう? あなたはまだ問題の原因を特定できていないわけだし、絞り込みの過程も説明されていませんが。
ということで「具体的な」話をするのはちょっと無理かと思います。

症状から言えば、
・ポインタ/配列の添字の扱いの誤り
・scanf系の関数のアドレス演算子(&)忘れ (今回はなさそうですが)
・gotoによるループ構文への飛び込み
・巨大なローカル配列変数
・深すぎる再帰関数
というあたりを疑います。確認してみてください。
コンパイラの警告はできるだけレベルを上げておいて、確実に潰しておく、なんていうのも地味に効果的かとも思います。

デバッガがアタッチされている状態なら、「何でもアイテム」処理のエントリーからステップ実行してみる、というのも手では。

投稿2021/11/07 23:02

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tger

2021/11/08 01:18

ありがとうございます。警告レベルを上げて、構文も見直した結果、おそらく問題はDrawBox関数内の変数の値にありました。 アドバイスありがとうございました。
guest

0

デバッグありで実行すると、フリーズしてしまいます。

デバッグ実行時にフリーズ状態が再現するのであれば、
[デバッグ] - [すべて中断] を選択し「呼び出し履歴」(コールスタック)を確認してみて下さい。
無限ループ等に陥っているのであれば、箇所が特定できるかと思います。

また、別の方法として、以下のツールでエラーの手がかりを調べることができるかもしれません。
■ “応答なし”になったアプリケーションに関する詳細レポートを出力「WhatIsHang」
https://forest.watch.impress.co.jp/docs/review/677946.html

投稿2021/11/07 15:55

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問