エラーがおきる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tako

エラーがおきる

#1

投稿記事 by tako » 10年前

はじめまして
龍神録プログラミングの館を利用しています。
自分は
1自機を動かす
2敵を動かす(表示させる)
3敵に弾を撃たせる(当たり判定なし)
の部分だけをとりあえず作りたくて書いていたのですが、動かそうとすると
「 0xC0000005: 場所 0x00000014 を読み込み中にアクセス違反が発生しました。」
と出てきて何も表示されないwindowだけがでてきて止まってしまいます。
以下にコードを
キー入力について

コード:

#ifndef KEYBOARD
#define KEYBOARD
void keypush();
int keyout(int keyname);
#endif

コード:

#include"DxLib.h"
#include"keyboard.h"

int m_key[256];
void keypush(){
	char tipkey[256];
	GetHitKeyStateAll(tipkey);
	for(int i=0;i<256;i++){
		if(tipkey[i]==1){m_key[i]++;}
		else{m_key[i]=0;}
	}
}
int keyout(int keyname){
	return m_key[keyname];
}
自機について

コード:

#ifndef PLAYER
#define PLAYER
struct player{
	int img;
	double x,y;
};
void player_initialize();
void player_update();
void player_draw();
void player_finalize();
#endif

コード:

#include "DxLib.h"
#include"player.h"
#include"keyboard.h"
#include"enemy.h"

#define PI 3.14159265

struct player player;

void player_initialize(){
	memset(&player,0,sizeof(player));
	player.img=LoadGraph("画像/キャラクタ01.png");
	player.x=200;
	player.y=200;
}
void player_update(){
	forshot(player.x,player.y);
	if(keyout(KEY_INPUT_UP)>=1){
		if(keyout(KEY_INPUT_LSHIFT)>0){
			player.y-=2;
		}else{
		player.y-=4;
		}
	}
	if(keyout(KEY_INPUT_DOWN)>=1){
		if(keyout(KEY_INPUT_LSHIFT)>0){
			player.y+=2;
		}else{
		player.y+=4;
		}
	}
	if(keyout(KEY_INPUT_RIGHT)>=1){
		if(keyout(KEY_INPUT_LSHIFT)>0){
			player.x+=2;
		}else{
		player.x+=4;
		}
	}
	if(keyout(KEY_INPUT_LEFT)>=1){
		if(keyout(KEY_INPUT_LSHIFT)>0){
			player.x-=2;
		}else{
		player.x-=4;
		}
	}
}

void player_draw(){
	DrawRotaGraphF((float)player.x,(float)player.y,1.0,0.0,player.img,TRUE);
}
void player_finalize(){
	DeleteGraph(player.img);
}
敵について

コード:

#ifndef ENEMY
#define ENEMY
struct enemy{
	int flag,
		count,
		pattern,
		muki,
		kind,
		hp,
		maxhp,
		img;
	double x,
		   y,
		   vx,
		   vy,
		   speed,
		   angle;
	int bltime,
		blkind,
		blkind2,
		color,
		state,
		wtime,
		wait;
};
struct enemyorder{
	int count,
		pattern,
		kind;
	double x,
		  y,
		  speed;
	int bltime,
		blkind,
		color,
		hp,
		blkind2,
		wait;
};
struct enemybullet{
	int flag,
		kind,
		count,
		color,
		state,
		till,
		eff;
	double x,
		  y,
		  angle,
		  speed,
		  baseangle[1],
		  remspeed[1];
};
struct enemyshot{
	int flag,
		kind,
		count,
		num;
	double baseangle[1],
		  basespeed[1];
	enemybullet bullet[1000];
};
void enemyinitialize();
void enemypattern(int i);
void enemyenter();
void enemyact();
void enemygraph();
void enemymain();
void shotinitialize();
void forshot(double x,double y);
double shotatan2(int n);
int shot_search(int n);
void shot_main();
void entershot(int i);
void graph_bullet();
void shot_calc(int n);
int enemy_num_search();
void load_story();
#endif

コード:

#include"DxLib.h"
#include"enemy.h"
#include"player.h"
#include"math.h"

#define MAXENEMY 10
#define MAXSHOT 30
#define MAXKINDSHOT 1
#define MAXBULLET 1000
#define MAXSE 100
#define PI 3.14159265
#define MAXENEMYORDER 500



int stagecount;
int enemyimg;
struct enemy enemy[MAXENEMY];
int bulletimg[3][3];
int soundse[MAXSE];
int seflag[MAXSE];
struct enemyshot enemyshot[MAXSHOT];
double playerx,
	  playery;
struct enemyorder enemyorder[MAXENEMYORDER];


extern void shot_bullet_H000(int);
extern void shot_calc();

void shotinitialize(){
	for(int j=0;j<MAXSHOT-1;j++){
	memset(&enemyshot[j],0,sizeof(enemyshot));
	}
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			bulletimg[i][j]=LoadGraph("画像/弾00.png");
		}
	}
}

void (*shot_bullet[MAXKINDSHOT])(int) ={
        shot_bullet_H000,
};
void shot_bullet_H000(int n){
        int k;
        if(enemyshot[n].count==0){
                if(enemyshot[n].flag!=2 && (k=shot_search(n))!=-1){
                        enemyshot[n].bullet[k].kind=enemy[enemyshot[n].num].blkind2;
                        enemyshot[n].bullet[k].angle=shotatan2(n);
                        enemyshot[n].bullet[k].flag=1;
                        enemyshot[n].bullet[k].x=enemy[enemyshot[n].num].x;
                        enemyshot[n].bullet[k].y=enemy[enemyshot[n].num].y;
                        enemyshot[n].bullet[k].color=enemy[enemyshot[n].num].color;
                        enemyshot[n].bullet[k].count=0;
                        enemyshot[n].bullet[k].speed=3;
                        seflag[0]=1;
                }
        }
}
void forshot(double x,double y){
	playerx=x;
	playery=y;
}

double shotatan2(int n){
        return atan2(playery-enemy[enemyshot[n].num].y,playerx-enemy[enemyshot[n].num].x);
}


int shot_search(int n){
        int i;
        for(i=0;i<1000;i++){
                if(enemyshot[n].bullet[i].flag==0){
                        return i;
                }
        }
        return -1;
}

void shot_main(){
        for(int i=0;i<30;i++){
     
                if(enemyshot[i].flag!=0 && 0<=enemyshot[i].kind && enemyshot[i].kind<MAXKINDSHOT){
                        shot_bullet[enemyshot[i].kind](i);
                        shot_calc(i);
                        enemyshot[i].count++;
                }
        }
}

void entershot(int i){
	for(int j=0;j<MAXSHOT;j++){
		if(enemyshot[j].flag==0){
			memset(&enemyshot[i],0,sizeof(enemyshot));
			enemyshot[j].flag=1;
			enemyshot[j].kind=enemy[i].blkind;
			enemyshot[i].num=i;
			return;
		}
	}
}
void graph_bullet(){
        int i,j;
        SetDrawMode( DX_DRAWMODE_BILINEAR ) ;
        for(i=0;i<MAXSHOT;i++){
                if(enemyshot[i].flag>0){
                        for(j=0;j<MAXBULLET;j++){
                                if(enemyshot[i].bullet[j].flag!=0){
                                        if(enemyshot[i].bullet[j].eff==1){
                                                SetDrawBlendMode( DX_BLENDMODE_ADD, 255) ;
										}
                                        DrawRotaGraphF(
                                                (float)enemyshot[i].bullet[j].x, (float)enemyshot[i].bullet[j].y,
                                                1.0, enemyshot[i].bullet[j].angle+PI/2,
                                                bulletimg[enemyshot[i].bullet[j].kind][enemyshot[i].bullet[j].color],TRUE);

                                        if(enemyshot[i].bullet[j].eff==1){
                                                SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
										}
                                }
                        }
                }
        }
        SetDrawMode(DX_DRAWMODE_NEAREST);
}

void shot_calc(int n){
        int i,max=0;
        if(enemy[enemyshot[n].num].flag!=1)
                enemyshot[n].flag=2;
        for(i=0;i<MAXBULLET;i++){
                if(enemyshot[n].bullet[i].flag>0){
                        enemyshot[n].bullet[i].x+=cos(enemyshot[n].bullet[i].angle)*enemyshot[n].bullet[i].speed;
                        enemyshot[n].bullet[i].y+=sin(enemyshot[n].bullet[i].angle)*enemyshot[n].bullet[i].speed;
                        enemyshot[n].bullet[i].count++;
                        if(enemyshot[n].bullet[i].x<-50 || enemyshot[n].bullet[i].x>640+50 ||
                                enemyshot[n].bullet[i].y<-50 || enemyshot[n].bullet[i].y>530){
                                if(enemyshot[n].bullet[i].till<enemyshot[n].bullet[i].count)
                                        enemyshot[n].bullet[i].flag=0;
                        }
                }
        }
 
        for(i=0;i<MAXBULLET;i++)
                if(enemyshot[n].bullet[i].flag>0)
                        return;
        if(enemy[enemyshot[n].num].flag!=1){
                enemyshot[n].flag=0;
                enemy[enemyshot[n].num].flag=0;
        }
}
extern void load_story();


void enemyinitialize(){
	stagecount=1;
		for(int j=0;j<MAXENEMY-1;j++){
	memset(&enemy[j],0,sizeof(enemy));
	}
	for(int i=0;i<MAXENEMY;i++){
		enemy[i].img=LoadGraph("画像/弾00.png");
	}
	load_story();
}
void load_story(){
        int n=0,num=0,fp;
        int input[64];
        char inputc[64];

        fp = FileRead_open("enemydata/storyH0.csv");
        if(fp == NULL){
                printfDx("read error\n");
                return;
        }
        for(int i=0;i<2;i++){
                while(FileRead_getc(fp)!='\n');
		}
        while(1){
                for(int i=0;i<64;i++){
                        inputc[i]=input[i]=FileRead_getc(fp);
                        if(inputc[i]=='/'){
                                while(FileRead_getc(fp)!='\n');
                                i=-1;
                                continue;
                        }
                        if(input[i]==',' || input[i]=='\n'){
                                inputc[i]='\0';
                                break;
                        }
                        if(input[i]==EOF){
                                goto EXFILE;
                        }
                }
                switch(num){
                        case 0: enemyorder[n].count      =atoi(inputc);break;
                        case 1: enemyorder[n].pattern  =atoi(inputc);break;
                        case 2: enemyorder[n].kind      =atoi(inputc);break;
                        case 3: enemyorder[n].x        =atof(inputc);break;
                        case 4: enemyorder[n].y        =atof(inputc);break;
                        case 5: enemyorder[n].speed       =atof(inputc);break;
                        case 6: enemyorder[n].bltime   =atoi(inputc);break;
                        case 7: enemyorder[n].blkind    =atoi(inputc);break;
                        case 8: enemyorder[n].color      =atoi(inputc);break;
                        case 9: enemyorder[n].hp       =atoi(inputc);break;
                        case 10:enemyorder[n].blkind2   =atoi(inputc);break;
                        case 11:enemyorder[n].wait     =atoi(inputc);break;
                }
                num++;
                if(num==12){
                        num=0;
                        n++;
                }
        }
EXFILE:
        FileRead_close(fp);
}


void enemypattern(int i){
	if(enemy[i].count==0){
		enemy[i].vx=2.0;
	}
	if(enemy[i].count==60){
		enemy[i].vx=0;
	}
	if(enemy[i].count==60+enemy[i].wait){
		enemy[i].vx=-2.0;
	}
}
int enemy_num_search(){
        for(int i=0;i<MAXENEMY;i++){
                if(enemy[i].flag==0){
                        return i;
                }
        }
        return -1;
}

void enemyenter(){
	        int i,t;
        for(t=0;t<MAXENEMYORDER;t++){
                if(enemyorder[t].count==stagecount){
                        if((i=enemy_num_search())!=-1){
                                enemy[i].flag   =1;
                                enemy[i].count    =0;
                                enemy[i].pattern=enemyorder[t].pattern;
                                enemy[i].muki   =1;
                                enemy[i].kind    =enemyorder[t].kind;
                                enemy[i].x      =enemyorder[t].x;
                                enemy[i].y      =enemyorder[t].y;
                                enemy[i].speed     =enemyorder[t].speed;
                                enemy[i].bltime =enemyorder[t].bltime;
                                enemy[i].blkind  =enemyorder[t].blkind;
                                enemy[i].blkind2 =enemyorder[t].blkind2;
                                enemy[i].color    =enemyorder[t].color;
                                enemy[i].wait   =enemyorder[t].wait;
                                enemy[i].hp     =enemyorder[t].hp;
                                enemy[i].maxhp =enemy[i].hp;
                                enemy[i].vx     =0;
                                enemy[i].vy     =0;
                                enemy[i].angle    =0;
						}
			}
	}
}
void enemyact(){
	for(int i=0;i<MAXENEMY;i++){
		if(enemy[i].flag==1){
			enemypattern(i);
			enemy[i].x+=enemy[i].vx;
			enemy[i].y+=enemy[i].vy;
			enemy[i].x+=cos(enemy[i].angle)*enemy[i].speed;
            enemy[i].y+=sin(enemy[i].angle)*enemy[i].speed;
			enemy[i].count++;
			if(enemy[i].x<-50||640<enemy[i].x|| enemy[i].y<-50 || 480<enemy[i].y){
				enemy[i].flag=0;}
			if(enemy[i].bltime==enemy[i].count){
				entershot(i);
			}
		}
	}

}

void enemygraph(){
	for(int i=0;i<MAXENEMY;i++){
		if(enemy[i].flag==1){
			DrawRotaGraphF((float)enemy[i].x,(float)enemy[i].y,1.0f,0.0f,enemy[i].img,TRUE);
		}
	}

}
void enemymain(){
	enemyenter();
	enemyact();	
	stagecount++;
}
メイン部分

コード:

#include "DxLib.h"
#include"player.h"
#include"keyboard.h"
#include"enemy.h"

int func_state=0;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
		if(ChangeWindowMode(TRUE)!=0){return 0;}
        if(DxLib_Init()!=0){return 0;}  
		if(SetDrawScreen(DX_SCREEN_BACK)!=0){
			DxLib_End();
			return 0;
		}

		SetMainWindowText("a");
		while(ProcessMessage()!=-1&&ScreenFlip()!=-1&&ClearDrawScreen()!=-1){

			 switch(func_state){

                        case 0:	
								enemyinitialize();
								player_initialize();
								shotinitialize();
								func_state=99;
								break;
						case 99:
								keypush();
								player_update();
								enemymain();
								shot_main();
								player_draw();
								graph_bullet();
								enemygraph();
                                break;

								
                        default:
                                printfDx("不明なfunc_state\n");
                                break;
                }

		}
        DxLib_End();
        return 0;
}
これで全てです。
私は考え方等がよくわからなかったので、龍神録プログラミングの館の方に載っているものをコピーし、理論を自分なりに理解して大丈夫だと思った範囲で省略や改変等を行っていたつもりだったのですが⋯
エラーについてもう少し具体的に書きますと止まった際メイン部分のwhile(~)の行の部分で「このスレッドによって現在の関数が実行された後、次に実行されるステートメントです」と言って矢印が表示されていましたので~の部分を分解して試してみたらClearDrawScreen();の部分でいつもそれが表示されるようです。
環境についてですが
windows8
VC++2010
を使っています。
どうすればエラーが出ずに自分のやりたい部分が正常に動くのか知りたいので、ご協力よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: エラーがおきる

#2

投稿記事 by みけCAT » 10年前

「敵について」の2番目のコードの32~34行目が怪しいです。
今のコードだと、不要なところ(配列の確保されているメモリの外)まで0で埋めようとしてしまうと思います。
素直に

コード:

memset(enemyshot,0,sizeof(enemyshot));
でいいと思います。

【追記】検証コードです。
http://ideone.com/0kR9RR
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

tako

Re: エラーがおきる

#3

投稿記事 by tako » 10年前

>みけCATさん
ご指摘ありがとうございます。
その部分を言われたように変えてみたらエラーがでなくなりました。しかし、メイン部分のfunc_stateが259回ループした後0に戻るようになるようになっているようで、
画面的には動作の途中で初期化処理がおきて画面が消え、同じことの繰り返しになってしまいます。そんな処理はした覚えはないのですが⋯

だんごさん
記事: 273
登録日時: 12年前

Re: エラーがおきる

#4

投稿記事 by だんごさん » 10年前

同様に「敵について」の2番目、159行目もエラーを起こしたコードと同じ動きをしているように思いますが、こちらはどうでしょうか?

コード:

for(int j=0;j<MAXENEMY-1;j++){
    memset(&enemy[j],0,sizeof(enemy));
}
 Dango San

tako

Re: エラーがおきる

#5

投稿記事 by tako » 10年前

>だんごさん
返信ありがとうございます
言われた部分をなおしましたが状況は変わらないようです⋯

閉鎖

“C言語何でも質問掲示板” へ戻る