![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e6f04cf)
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.3
- 回答日時:
「今の段階では弾は一種類だけ」ということは「今の段階でstypeは0以外ありえない」という意味ですよね?
どこかにstypeに0以外を指定しているENEMYはないですか?
Picosoftさんいつもありがとうございます。
今の段階でstypeは0以外ありえないという意味です
stypeに0以外を指定しているENEMYについては
switch文の部分でこのように指定している部分が
case 2: data[row].stype=atoi(buf); break;
だけです。
それでswitch文のコードの最後で敵クラスの生成をしています。
全体のコードでstypeに0以外を指定しているような部分は
これだけです。
それでcontrol.cppですべてのクラスを操作しています
今回はcontrol.cppで
外部データ(エクセル)を読み込んで、
それを変数に入るようにしています。
それが下記にもあるこれです
fp = fopen("enemydata.csv","r");
このエクセル内容が(敵キャラ五匹分です)
敵の種類 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
です。
コードは
control.cpp
control.h
enemy.h
define.hは前回載せていなかった
ENEMYDATAの部分をのせました。
前回と今回のでENEMY関係はこれで全部です。
失礼します。
(control.cpp)
#include "pch.h"
#include "control.h"
#include <stdio.h>
CONTROL::CONTROL()
{
player = new PLAYER;
back = new BACK;
FILE *fp;
ENEMYDATA data[ENEMY_NUM];
char buf[100];
int c;
int col=1;
int row=0;
memset(buf,0,sizeof(buf));
fp = fopen("enemydata.csv","r");
//ヘッダ読み飛ばし
while(fgetc(fp)!='\n');
while(1){
while(1){
c=fgetc(fp);
//末尾ならループを抜ける。
if(c==EOF)
goto out;
//カンマか改行でなければ、文字としてつなげる
if(c!=','&& c!='\n')
strcat(buf,(const char*)&c);
//カンマか改行ならループ抜ける。
else
break;
}
//ここにきたということは、1セル分の文字列が出来上がったということ
switch(col){
//1列目は敵種類を表す。atoi関数で数値として代入。
case 1: data[row].type=atoi(buf); break;
//2列目は弾種類。以降省略。
case 2: data[row].stype=atoi(buf); break;
case 3: data[row].m_pattern=atoi(buf); break;
case 4: data[row].s_pattern=atoi(buf); break;
case 5: data[row].in_time=atoi(buf); break;
case 6: data[row].stop_time=atoi(buf); break;
case 7: data[row].shot_time=atoi(buf); break;
case 8: data[row].out_time=atoi(buf); break;
case 9: data[row].x=atoi(buf); break;
case 10: data[row].y=atoi(buf); break;
case 11: data[row].speed=atoi(buf); break;
case 12: data[row].hp=atoi(buf); break;
case 13: data[row].item=atoi(buf); break;
}
//バッファを初期化
memset(buf,0,sizeof(buf));
//列数を足す
++col;
//もし読み込んだ文字が改行だったら列数を初期化して行数を増やす
if(c=='\n'){
col=1;
++row;
}
}
out:
//敵クラス生成
for(int i=0;i<ENEMY_NUM;++i){
enemy[i]=new ENEMY(
data[i].type,
data[i].stype,
data[i].m_pattern,
data[i].s_pattern,
data[i].in_time,
data[i].stop_time,
data[i].shot_time,
data[i].out_time,
data[i].x,
data[i].y,
data[i].speed,
data[i].hp,
data[i].item);
}
}
void CONTROL::All()
{
//int count = 0;
//描画領域を指定
SetDrawArea(MARGIN,MARGIN,MARGIN+380,MARGIN+460);
back->All();
//プレイヤークラスのAll関数実行
player->All();
for(int i=0;i<ENEMY_NUM;++i){
if(enemy[i]!=NULL){
if(enemy[i]->All()){
delete enemy[i];
enemy[i]=NULL;
}
}
}
++g_count;
}
CONTROL::~CONTROL()
{
//プレイヤークラスの解放
delete player;
delete back;
for(int i=0;i<ENEMY_NUM;++i){
if(enemy[i]!=0){
delete enemy[i];
}
}
}
(control.h)
#include "player.h"
#include "back.h"
#include "enemy.h"
class CONTROL
{
private:
double y;
private:
//プレイヤークラスのポインタ
PLAYER *player;
//背景クラス
BACK *back;
ENEMY *enemy[ENEMY_NUM];
public:
CONTROL();
CONTROL();
void All();
};
(enemy.h)
#include "pch.h"
class ENEMY
{
private:
//座標とグラフィックハンドル
double x,y;
int gh[3];
//画像サイズ
int width,height;
//出現、停止、帰還、発射タイミング
int in_time,stop_time,out_time,shot_time;
//敵の種類
int type;
//弾の種類
int stype;
//移動パターン
int m_pattern;
//ショットパターン
int s_pattern;
//弾スピード
int speed;
int hp;
int item;
//敵が出現してからのカウント
int count;
//敵消滅フラグ
bool deadflag;
//敵クラス消滅フラグ
bool endflag;
//弾の構造体
E_SHOT shot[ENEMY_SNUM];
//ショットが撃てるようになったかのフラグ
bool sflag;
//ショットが撃てるようになってからのカウント
int scount;
//関数関係
public:
bool All();
void Move();
void Shot();
void Draw();
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//アイテム
);
};
(define.h)
struct ENEMYDATA{
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;//アイテム
};
#define ENEMY_NUM 5//敵の数
No.2
- 回答日時:
細かくソース読む気もありませんが……
まぁ、すでに回答されている内容で十分…でしょうな。
というか、変数名tempってのが判りにくいってのもありますかねぇ。
もう少し意味のある名前をつけるように工夫した方がいいかと思いますよ。
# まぁ、私も~Tempとかの変数名はよく使いますけどね。
No.1
- 回答日時:
> いろいろみなさんに意見をいただいたのですが
> stype!=0のときの処理が書けません。
> 初期化は出来たのですが、複数の敵が弾をだすはずが
> プレイヤーしかでなくなりました。
> またいろいろ意見お願いします。
んなもん知らんよ。
……と言うのが結論ですが、なぜそう言わないとならないかを以下に説明します。
今回問題になっているのはコンストラクタの以下のコードです。
> int temp;
> //弾画像読み込み
> if(stype==0){
> temp=LoadGraph("enemyshot1.png");
> }
ここで stype が何なのかを見てみるとコンストラクタの引数の
> int stype,//弾種類
だとわかります。つまり、問題のコードを日本語に書き直すと、
(弾の画像のハンドルを格納する) temp という変数を用意する。
もし弾種類が 0 ならば enemyshot1.png という画像を読み込んでそのハンドルの値を temp に格納する。
となります。
では弾種類が 0 でない、たとえば 1 の場合どんな画像を弾の画像として読み込めばいいのか?
これはあなたにしかわかりませんし、そもそも弾が何種類あるのか、弾種類が想定する値以外の値が stype に入ってきたときにどんな画像にするのか、それともエラーとするのかについては、あなた自身が決定しなくてはならない問題です。
そのような問題について質問されても、された側としては「んなもん知らんよ」としか答えようがありません。
繰り返しますが、弾種類が 0 でない場合どんな画像を弾の画像として読み込めばいいのかは「あなた」が決定しなくてはならないことです。それを決めてきたなら答えようがありますので決めてください。
お疲れ様です。
意見ありがとうございます。
今、サイトのサンプルを勉強しているかぎりでは
弾種類と定義しているだけで
今の段階では弾は一種類だけで
このサンプルの現段階の題名が
複数の敵を表示しようで
五匹の敵が出てきてどの敵も同じ弾を撃つところまでで
弾を増やす見たいな課題はもう少し先の課題になっていて
いろいろ理屈はわかっていてもいざコードにしようとすると書けなく
こんがらがっていますが、がんばります。
失礼します。
お探しの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ランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
intとlongは同じ?
-
C言語で%を使わない余りの出し方
-
2の補数を計算するプログラム
-
再起呼び出しの回数をカウント...
-
画像の拡大・縮小
-
迷路を脱出する経路探索プログ...
-
分数の足し算をさせるプログラ...
-
OpenCVによる4値化について
-
3のつく数と3の倍数を表示 C言語
-
C言語で簡単なパックマンゲーム...
-
ヌメロンのプログラム
-
C++で表を作成したいのです ...
-
複数の共有メモリの作成
-
カードシャッフルのブログラム...
-
whileとifを使い偶数を出すには
-
関数とビット列
-
【C#】SQL文の中に変数を埋め込...
-
異なるn個の整数からr個の整数...
-
c言語プログラミングについて f...
-
条件が多い場合
おすすめ情報