dポイントプレゼントキャンペーン実施中!

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;

}

}

A 回答 (13件中1~10件)

現状の理解状態から推察するに…先は長そうですねぇ……。



>あとゴミが残っているとはどういう内容か知りたいです。

未初期化のローカル変数がどうなっているのか?
ということを勉強してくださいな。

>データーはエクセルの一つのセルに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/
などなど……
    • good
    • 0
この回答へのお礼

お疲れ様です。

理解不足ですいません。

CSV出力した時にどういう形式になっているのか理解しています?

いいえ

出力したCSVをテキストエディタで眺めたことはありますか??

いいえ

サイトを確認しながら先が長くならないように努力します。
ありがとうございました。
失礼します。

お礼日時:2014/02/14 11:27

本当にそのようなデータなのですか?



データは, 本当に「1行に 1個ずつ書かれている」のですか?

自分のコードがどのようなデータを期待しているか, 理解できていますか?
    • good
    • 0
この回答へのお礼

お疲れ様です。

データーはエクセルの一つのセルに1個ずつ
書かれています。

自分のコードがどのようなデータを期待しているか, 理解できていますか?
について

敵キャラ5匹分の
敵の種類、弾の種類、移動パターン、発射パターン、出現時間、停止、
発射、帰還、X座標、Y座標、弾スピード、HP、アイテムの値を
読み込み出力することです。

いつも丁寧にありがとございます。
失礼します。

お礼日時:2014/02/14 03:09

>全員が全員意図的に無視しているような感じがしてきた



意図的に無視していたわけでもなく、たいして気にしていなかった……。
が、まぁ、データ形式が微妙ですね。
# 掲示しているコードだと列と行が入れ替わっていることになりますし……。

意図した状態にデータを切り出せているのか…は自前で確認してもらいたいところ。
# なんか、だんだん当初の問題から離れていっているなぁ…。
    • good
    • 0
この回答へのお礼

いつもありがとございます。
まだ解決はしていないですがいろいろまとめながら
前に進み解決したいと思います。

失礼します。

お礼日時:2014/02/13 23:18

全員が全員意図的に無視しているような感じがしてきたのですが, 読み込ませているデータは本当に


---------- ここから ----------
敵の種類 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 への「お礼」に書いた「エクセル内容」は何の役にも立ちません. そんなクズを見せるのは「時間と労力の無駄」でしかないので, そんなことをするくらいなら (最初の数行でいいので) 実際のデータを出してください.
    • good
    • 0
この回答へのお礼

いつもありがとうございます。
形式の部分ですが実は
敵の種類
0
0
0
0
0
と1セルごとに中に記述してあります。(以下省略)
この形式でもカンマは必要ですか。
あとゴミが残っているとはどういう内容か知りたいです。
いろいろ勉強不足ですいません。

また見かけたらよろしくお願いします。

お礼日時:2014/02/13 23:13

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()を使うこともある。
    • good
    • 0
この回答へのお礼

いつもありがとございます。

まだ解決はしていないですがいろいろ検索しながら
他の方法も勉強しながら理解を深め解決したいと
思います。

また見かけたらよろしくお願いします。

お礼日時:2014/02/13 23:23

> throw "Unknown stype\n"; でためさせてもらいました。


> そしたら以下のエラーが出てしまいました。
#4のコードは「stype==0じゃなかったらエラー発生とみなす」というコードです。
つまり、「エラーが出た」ということは「stype!=0になっているENEMYがいる」ということです。
(#7でも指摘されていますが)

ファイルの読み込み部分を確認し、本当に意図通りに読み込めているかをチェックしてください。
    • good
    • 0
この回答へのお礼

いつもありがとうございます。

throw "Unknown stype\n"; については
勉強不足ですいません。

ファイルの読み込み部分でまだいきずまっていますが
まとめながら進みたいと思います。

失礼します。

お礼日時:2014/02/13 23:28

それはつまり


stype == 0 を満たさないやつがいる
ってことじゃないか? データをきちんと読み込めているかどうか, 確認した?

あと #6 についていえば「単に 1文字ずつつなげる」だけなんだから strcat なんか使うことはない. 例えば
char *buf_ptr;
を用意し, memset のところを
buf_ptr = buf;
として strcat を呼び出す代わりに
*buf_ptr++ = c;
とする. そして, // ここにきたということは の次の switch の前で
*buf_ptr = '\0';
とすればいい... あれ? なんか読み込み部分にすごい違和感がある....
    • good
    • 0
この回答へのお礼

いつもありがとうございます。

いろいろ勉強になります。
がんばります。
失礼します。

お礼日時:2014/02/13 23:32

あ, 処理系が書いてあるのを見落としてた. バッファオーバーラン以外のバグはないな. ごめんなさい.



とはいえ非常に不思議な書き方ではある. なぜに strcat?
    • good
    • 0
この回答へのお礼

Tacosanさん投稿していただきありがとうございます。
初心者な分知識が薄いためみなさんのいろんな言葉が
勉強になり気になることばかりでプログラムの好きな
自分にとってはたのしいことばかりです。
strcat?の理由もすごく気になります。知りたいです。
バッファオーバーランについても知識が薄いため
自分なりにも勉強して理解をするようにします。
みなさんのように回答できるようになりたいです。
失礼します。

お礼日時:2014/02/06 01:27

本題ではありませんが....



#3 への「お礼」にあるプログラムにはバグが潜んでいます. 認識できていますか?
    • good
    • 0

> 今の段階でstypeは0以外ありえないという意味です


ということなら、今の段階では「stypeに0以外の数字が入っているのは想定外だからエラー」という風にしておけばいいのでは?

//弾画像読み込み
if(stype==0){
 temp=LoadGraph("enemyshot1.png");
}else{
 //stype!=0なのは想定外
 throw "Unknown stype\n"; //例外にするなり、とりあえずstype==0のときと同様にして続行するなり、ご自由にどうぞ
}
    • good
    • 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.

(たぶんこんな感じのことがかいてあるとおもうのですが)
この適用は、異常な方法でそれを終了することをランタイムに要求しました。
詳細については適用のサポート・チームと連絡をとってください。

お礼日時:2014/02/06 01:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!