![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
Microsoft Visual C++ Debug Library
と言うエラーが発生しました。
Visual C++ 2008 Express Edition を使っています。
状況は以下になります。
Program:C:\DxLib_VC\サンプルプログラム実行用フォルダ
\Debug\DxLib_VC2008用.exe
Module:C:\DxLib_VC\サンプルプログラム実行用フォルダ
\Debug\DxLib_VC2008用.exe
File:
Run-Time Check Failure #3 - The variable 'temp' is being used
without being initialized
(Press Retry to debug the application)
Run-Timeの部分から自分なりに調べてみたのですが
ランタイム・チェック失敗#3-変数'temp'は初期化されずに使用されています
と書いてあると思います。
それで
いろいろみなさんに意見をいただいたのですが
stype!=0のときの処理が書けません。
初期化は出来たのですが、複数の敵が弾をだすはずが
プレイヤーしかでなくなりました。
またいろいろ意見お願いします。
tempの部分のコードは以下です。
(define.h)
struct E_SHOT{
bool flag;//弾が発射中かどうか
double x;//x座標
double y;//y座標
int gh;//グラフィックハンドル
int width,height;//画像の幅と高さ
int pattern;//ショットパターン
int speed;//弾スピード
};
#define ENEMY_SNUM 50//敵の弾の上限
(enemy.cpp)
#include "pch.h"
#include "enemy.h"
ENEMY::ENEMY(
int type,//敵タイプ、
int stype,//弾種類
int m_pattern,//移動パターン、
int s_pattern,//発射パターン
int in_time,//出現時間、
int stop_time,//停止時間、
int shot_time,//弾発射時間、
int out_time,//帰還時間、
int x,//x座標、
int y,//Y座標、
int speed,//弾スピード
int hp,//HP
int item//アイテム)
{
//サイズ
width=27;
height=25;
//敵の種類
this->type=type;
//弾の種類
this->stype=stype;
//移動パターンとショットパターン
this->m_pattern=m_pattern;
this->s_pattern=s_pattern;
this->speed=speed;
//座標セット
this->x=x;
this->y=y;
//出現、停止、発射、帰還セット
this->in_time=in_time;
this->stop_time=stop_time;
this->shot_time=shot_time;
this->out_time=out_time;
//hpとアイテム代入
this->hp=hp;
this->item=item;
//弾初期化
memset(shot,0,sizeof(shot));
//敵画像読み込み
if(type==0){
LoadDivGraph("enemy.png",3,1,3,27,25,gh);
}
int temp;
//弾画像読み込み
if(stype==0){
temp=LoadGraph("enemyshot1.png");
}
//サイズ取得
int w,h;
GetGraphSize(temp,&w,&h);
//弾の初期化
for(int i=0;i<ENEMY_SNUM;++i){
shot[i].flag=false;
shot[i].gh=temp;
shot[i].width=w;
shot[i].height=h;
shot[i].pattern=s_pattern;
shot[i].speed=speed;
shot[i].x=x;
shot[i].y=y;
}
count=0;
scount=0;
deadflag=false;
endflag=false;
sflag=false;
}
void ENEMY::Move()
{
//出てきてから止まる時間までの間なら下に移動
if(in_time<g_count && g_count<stop_time){
y+=2;
//帰還時間を過ぎたら戻る。
}else if(g_count>out_time){
y-=2;
if(y<-40){
deadflag=true;
}
}
}
void ENEMY::Draw()
{
int temp;
//弾から最初に描画
for(int i=0;i<ENEMY_SNUM;++i){
if(shot[i].flag){
DrawGraph(shot[i].x,shot[i].y,shot[i].gh,true);
}
}
if(!deadflag){
temp= count%40/10;
if(temp==3)
temp=1;
DrawGraph(x,y,gh[temp],TRUE);
}
}
bool ENEMY::All()
{
Move();
Shot();
Draw();
++count;
return endflag;
}
void ENEMY::Shot()
{
//発射タイミングになったら、フラグを立てる
if(shot_time==g_count){
sflag=true;
}
//フラグを立てるときだけ
if(sflag){
switch(s_pattern){
case 0:
//10回に一回発射。40までなので5発発射。
if(scount%10==0 && scount<=40){
for(int i=0;i<ENEMY_SNUM;++i){
//フラグが立ってない弾を探して、座標をセット
if(shot[i].flag==false){
shot[i].flag=true;
shot[i].x=x;
shot[i].y=y;
break;
}
}
}
break;
}
//フラグが立ってる弾の数
int s=0;
//フラグが立ってる弾だけ、弾の移動を行う
for(int i=0;i<ENEMY_SNUM;++i){
if(shot[i].flag){
shot[i].y+=shot[i].speed;
//弾が画面をはみ出たらフラグを戻す。
if(shot[i].x<-20 || shot[i].x>420
|| shot[i].y<-20 || shot[i].y>500){
shot[i].flag=false;
continue;
}
++s;
}
}
//sがゼロということは発射中の弾がない。
//かつdeadflagがTRUEということはこの敵のクラスは消滅させてよい
if(s==0 && deadflag){
//敵クラス消滅フラグをTRUEにする
endflag=true;
}
++scount;
}
}
No.13ベストアンサー
- 回答日時:
現状の理解状態から推察するに…先は長そうですねぇ……。
>あとゴミが残っているとはどういう内容か知りたいです。
未初期化のローカル変数がどうなっているのか?
ということを勉強してくださいな。
>データーはエクセルの一つのセルに1個ずつ
CSV出力した時にどういう形式になっているのか理解しています?
というか、出力したCSVをテキストエディタで眺めたことはありますか??
読み込み処理の部分、デバッガのステップ実行で1つずつ追いかけて、
・期待する動作はどんなものだったのか
・実際の動作はどうなのか
を確認した方がいいでしょう。
http://marupeke296.com/DBG_No1_Step.html
http://www.atmarkit.co.jp/fdotnet/chushin/vsdebu …
http://www.a.math.ryukoku.ac.jp/~hig/guide/vs200 …
http://visualstudiostudy.blog.fc2.com/blog-entry …
http://news.mynavi.jp/articles/2008/08/18/debug/
などなど……
お疲れ様です。
理解不足ですいません。
CSV出力した時にどういう形式になっているのか理解しています?
いいえ
出力したCSVをテキストエディタで眺めたことはありますか??
いいえ
サイトを確認しながら先が長くならないように努力します。
ありがとうございました。
失礼します。
No.12
- 回答日時:
本当にそのようなデータなのですか?
データは, 本当に「1行に 1個ずつ書かれている」のですか?
自分のコードがどのようなデータを期待しているか, 理解できていますか?
お疲れ様です。
データーはエクセルの一つのセルに1個ずつ
書かれています。
自分のコードがどのようなデータを期待しているか, 理解できていますか?
について
敵キャラ5匹分の
敵の種類、弾の種類、移動パターン、発射パターン、出現時間、停止、
発射、帰還、X座標、Y座標、弾スピード、HP、アイテムの値を
読み込み出力することです。
いつも丁寧にありがとございます。
失礼します。
No.11
- 回答日時:
>全員が全員意図的に無視しているような感じがしてきた
意図的に無視していたわけでもなく、たいして気にしていなかった……。
が、まぁ、データ形式が微妙ですね。
# 掲示しているコードだと列と行が入れ替わっていることになりますし……。
意図した状態にデータを切り出せているのか…は自前で確認してもらいたいところ。
# なんか、だんだん当初の問題から離れていっているなぁ…。
No.10
- 回答日時:
全員が全員意図的に無視しているような感じがしてきたのですが, 読み込ませているデータは本当に
---------- ここから ----------
敵の種類 0 0 0 0 0
弾の種類 0 0 0 0 0
移動パタターン0 0 0 0 0
発射パターン 0 0 0 0 0
出現時間60 120 180 240 300
停止 120 180 240 300 360
発射 121 181 241 301 361
帰還 300 340 400 460 520
X座標 50 100 150 200 250
Y座標 -40 -40 -40 -40 -40
弾のスピード 4 4 4 4 4
HP 1 1 1 1 1
アイテム 0 0 0 0 0
---------- ここまで ----------
という形式なんですか? もしそうだとしたら, 途中にカンマが出てこないから 1行丸ごと読み込んじゃいますよ. つまり, type 以外には何も読み込まないから, stype にはゴミが残ったままです.
データの形式が上の様ではないというなら, あなたが #3 への「お礼」に書いた「エクセル内容」は何の役にも立ちません. そんなクズを見せるのは「時間と労力の無駄」でしかないので, そんなことをするくらいなら (最初の数行でいいので) 実際のデータを出してください.
いつもありがとうございます。
形式の部分ですが実は
敵の種類
0
0
0
0
0
と1セルごとに中に記述してあります。(以下省略)
この形式でもカンマは必要ですか。
あとゴミが残っているとはどういう内容か知りたいです。
いろいろ勉強不足ですいません。
また見かけたらよろしくお願いします。
No.9
- 回答日時:
fgetc()で1文字ずつ読み込んで~とか処理しているから変に見えるんじゃないですかねぇ……。
Cランタイム使うならfgets()で1行まるっと読み込んで、CSVをパースする方がいいのではないかと。
# CSVをパースする処理自体はよくあるパターンなので、検索すればいろいろ見つかるでしょう。
# 「CSV C言語 読み込み」辺りで探せばそれなりに見つかるはずです。
# エラー処理簡略化するならstrtok()でぶった切ってもいいでしょうし。(strtok()でcsvを読み込む場合の問題点も検索すれば出てくるでしょうし)
読み込み処理自体もwhile(1)の無限ループとgotoでの脱出というのが違和感醸し出す元かと思われます。
>case 2: data[row].stype=atoi(buf); break;
のところでdata[row].stypeが0以外の値になったらbufの内容を確認する。
みたいなコードを埋め込めば、とりあえずの原因は探せるかもしれません。
私なら…読み込み中のcsvファイルの行数をカウントするようにして、
case 2:
data[row].stype=atoi(buf);
if(data[row].stype != 0) {
int a = 0;
}
break;
でint a = 0;にブレークポイントを設定する…とかしますかね。
# TRACE()マクロとかOutputDebugString()を使うこともある。
いつもありがとございます。
まだ解決はしていないですがいろいろ検索しながら
他の方法も勉強しながら理解を深め解決したいと
思います。
また見かけたらよろしくお願いします。
No.8
- 回答日時:
> throw "Unknown stype\n"; でためさせてもらいました。
> そしたら以下のエラーが出てしまいました。
#4のコードは「stype==0じゃなかったらエラー発生とみなす」というコードです。
つまり、「エラーが出た」ということは「stype!=0になっているENEMYがいる」ということです。
(#7でも指摘されていますが)
ファイルの読み込み部分を確認し、本当に意図通りに読み込めているかをチェックしてください。
いつもありがとうございます。
throw "Unknown stype\n"; については
勉強不足ですいません。
ファイルの読み込み部分でまだいきずまっていますが
まとめながら進みたいと思います。
失礼します。
No.7
- 回答日時:
それはつまり
stype == 0 を満たさないやつがいる
ってことじゃないか? データをきちんと読み込めているかどうか, 確認した?
あと #6 についていえば「単に 1文字ずつつなげる」だけなんだから strcat なんか使うことはない. 例えば
char *buf_ptr;
を用意し, memset のところを
buf_ptr = buf;
として strcat を呼び出す代わりに
*buf_ptr++ = c;
とする. そして, // ここにきたということは の次の switch の前で
*buf_ptr = '\0';
とすればいい... あれ? なんか読み込み部分にすごい違和感がある....
No.6
- 回答日時:
あ, 処理系が書いてあるのを見落としてた. バッファオーバーラン以外のバグはないな. ごめんなさい.
とはいえ非常に不思議な書き方ではある. なぜに strcat?
Tacosanさん投稿していただきありがとうございます。
初心者な分知識が薄いためみなさんのいろんな言葉が
勉強になり気になることばかりでプログラムの好きな
自分にとってはたのしいことばかりです。
strcat?の理由もすごく気になります。知りたいです。
バッファオーバーランについても知識が薄いため
自分なりにも勉強して理解をするようにします。
みなさんのように回答できるようになりたいです。
失礼します。
No.4
- 回答日時:
> 今の段階でstypeは0以外ありえないという意味です
ということなら、今の段階では「stypeに0以外の数字が入っているのは想定外だからエラー」という風にしておけばいいのでは?
//弾画像読み込み
if(stype==0){
temp=LoadGraph("enemyshot1.png");
}else{
//stype!=0なのは想定外
throw "Unknown stype\n"; //例外にするなり、とりあえずstype==0のときと同様にして続行するなり、ご自由にどうぞ
}
Picosoftさんお疲れ様です。
いつも感謝します。
throw "Unknown stype\n"; でためさせてもらいました。
そしたら以下のエラーが出てしまいました。
でも、throwやRuntime Error!についても理解が薄いので
勉強しながら頑張りたいと思います。
ありがとうございました。
失礼します。
Microsoft Visual C++ Runtime Library
Runtime Error!
Program:
This application has requested the Runtime to terminate it in an unusual way
Please contact the application's support team for more information.
(たぶんこんな感じのことがかいてあるとおもうのですが)
この適用は、異常な方法でそれを終了することをランタイムに要求しました。
詳細については適用のサポート・チームと連絡をとってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像の拡大・縮小
-
intとlongは同じ?
-
クイックソート
-
processingのプログラムの書き...
-
C言語で%を使わない余りの出し方
-
DXライブラリによるパズルゲー...
-
再起呼び出しの回数をカウント...
-
カードシャッフルのブログラム...
-
プログラムの時、フローチャー...
-
C言語の問題
-
C++でフィボナッチ数
-
argvのNULLチェック
-
迷路を脱出する経路探索プログ...
-
迷路の解を見つけるアルゴリズム
-
2の補数を計算するプログラム
-
c++でテンプレートのコードでわ...
-
#define _CRT_SECURE_NO_WARNIN...
-
Enterキーを押されたら次の処理...
-
2分法で方程式の複数の解を自...
-
比較回数と交換回数表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
intとlongは同じ?
-
C言語で%を使わない余りの出し方
-
2の補数を計算するプログラム
-
再起呼び出しの回数をカウント...
-
画像の拡大・縮小
-
迷路を脱出する経路探索プログ...
-
分数の足し算をさせるプログラ...
-
OpenCVによる4値化について
-
3のつく数と3の倍数を表示 C言語
-
C言語で簡単なパックマンゲーム...
-
ヌメロンのプログラム
-
C++で表を作成したいのです ...
-
複数の共有メモリの作成
-
カードシャッフルのブログラム...
-
whileとifを使い偶数を出すには
-
関数とビット列
-
【C#】SQL文の中に変数を埋め込...
-
異なるn個の整数からr個の整数...
-
c言語プログラミングについて f...
-
条件が多い場合
おすすめ情報