ページ 11

ポインタエラー

Posted: 2009年11月10日(火) 10:08
by ひよこ
引数をちょっと変更してポインタエラーが出て、戻しても、ポインタエラーになってしまいます。
龍神録とリストを使っているのですが、上のような状態になってしまいました。
場所はenemy.cppのenemy_enterのenter_enemy_t *next_enemy = check_enemy->next;//head_enemy->nextで
RyuJin.exe の 0x0054962a で初回の例外が発生しました: 0xC0000005: 場所 0xfdfdfe35 を読み込み中にアクセス違反が発生しました。
RyuJin.exe の 0x0054962a でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfdfdfe35 を読み込み中にアクセス違反が発生しました。
となっています。どうすればいいのでしょうか?
ソースは戻した状態なんですが。

Re:ポインタエラー

Posted: 2009年11月10日(火) 10:24
by softya
前にも言いましたがリストの繋がりをデバッガで追いかけた結果を教えてください。
例外が発生したときのcheck_enemyのポインタ値が疑わしいです。

>となっています。どうすればいいのでしょうか?
間違いなくバグっています。もし今まで動いていたなら偶然かもしれません。
前にも説明しましたが、リスト構造はうまく動いているように見えてもバグを内包している可能性がありますので、かならずデバッガでリスト構造を確認してください。もし、リスト構造を確認する上で分からない事があるなら聞いてください。

Re:ポインタエラー

Posted: 2009年11月10日(火) 10:47
by ひよこ
デバッガで追ってみると
load.cppで一回目のcsvの読み込みで
new_enter_enemy = new enter_enemy_t;new_enter_enemy->next=NULL;でNULLになるはずなのに
next = 0xfdfdfdfd {x=??? y=??? angle=??? ...}となっていませんでした。どうしてなんでしょうか?

Re:ポインタエラー

Posted: 2009年11月10日(火) 11:18
by softya
どの時点でnext = 0xfdfdfdfdとなっているいか、デバッガで1ステップづつ追いかけてみてください。

Re:ポインタエラー

Posted: 2009年11月10日(火) 11:44
by ひよこ
new_enter_enemy->next=NULL;でこの行を実行する前と実行後に0xfdfdfdfdがあります。

Re:ポインタエラー

Posted: 2009年11月10日(火) 12:37
by softya
new_enter_enemyは、何処を指していますか?

Re:ポインタエラー

Posted: 2009年11月10日(火) 12:48
by ひよこ
何処を指していますか?
>>意味のことですか?

Re:ポインタエラー

Posted: 2009年11月10日(火) 13:00
by softya
その時のnew_enter_enemyのポインタ値を教えてください。
>何処を指していますか?
ポインタなのでアドレスの何処を指すって表現をします。

Re:ポインタエラー

Posted: 2009年11月10日(火) 13:16
by ひよこ
そういう意味なんですか、
new_enter_enemy = 0x01e81288
next = 0xfdfdfdfd
です。

Re:ポインタエラー

Posted: 2009年11月10日(火) 14:05
by softya
>new_enter_enemy = 0x01e81288
まともなアドレスに見えますね。

>new_enter_enemy->next=NULL;でこの行を実行する前と実行後に0xfdfdfdfdがあります。
NULLを代入し損なう状況が分からないですね。

もう一度調べてもらえますか?
new_enter_enemy->next=NULL; ← ここの時点と
new_enter_enemy->count =atoi(inputc);break; ← ここの時点
それぞれ、new_enter_enemyとnew_enter_enemy->nextの値を調べてください。
それと、NULLの代入に成功している場合の値も教えてください。

Re:ポインタエラー

Posted: 2009年11月10日(火) 14:31
by ひよこ
NULLの代入は成功していないようです。
成功していたソースも同じように
new_enter_enemy->next 0xfdfdfdfd でした。

Re:ポインタエラー

Posted: 2009年11月10日(火) 18:34
by softya
うーん。謎ですね。
リリースビルドでデバッグしてるって事は無いですか?
その場合はデバッガは正しい値を表示しません。

Re:ポインタエラー

Posted: 2009年11月10日(火) 21:41
by ひよこ
デバッグですね。自分的にはおかしい部分はないと思うのですが、
softyaさんはソース見ましたか?

Re:ポインタエラー

Posted: 2009年11月10日(火) 22:04
by softya
>softyaさんはソース見ましたか?
ソースもjpgも見ました。
ソースは、load_enemy_data()を見る限り問題なさそうに見えますが、何か単純な見落としがあるんじゃないかと疑っています。その場合はデバッガしか頼れるものが無いんですよね。

えーと
>new_enter_enemy->next=NULL;
のところでデバッガで止めて、右クリックで逆アセンブルを表示でアセンブラコードがどうなっているか見せてもらえないでしょうか?さっきみたいにjpgでお願いします。

Re:ポインタエラー

Posted: 2009年11月10日(火) 22:36
by ひよこ
これでいいでしょうか、自分には意味がさっぱりなんですけど。

Re:ポインタエラー

Posted: 2009年11月10日(火) 22:55
by softya
はて?
NULLは代入してますが、NULLの代入オフセットが変ですね。

構造体は、こうですよね(オフセットの計算がしてあります)?
{
double x,y; 0x00,0x08
double angle; 0x10,0x18
double spd; 0x20
int state; 0x28
int knd; 0x2c
int wait; 0x30
int pattern; 0x34
int count; 0x38
int hp; 0x3c
struct enter_enemy_t* next; 0x40 //次の要素へのポインタ
};
これなら、0x40にNULLを代入するはずですが、
>mov dword ptr [eax+34h],0
で0x34にNULLを代入してますね。
それとも、デバッグで追いかけているのは違う構造体のプログラムなんでしょうか?

Re:ポインタエラー

Posted: 2009年11月10日(火) 23:13
by ひよこ
上の構造体です。enter_enemy_tです。
0xはどこに書いてあったか知りませんが、どこか初期化がいけないのでしょうか?

Re:ポインタエラー

Posted: 2009年11月10日(火) 23:32
by softya
>0xはどこに書いてあったか知りませんが、どこか初期化がいけないのでしょうか?
0xは構造体のオフセットを私が計算しましした。
問題なのは、コンパイラが0x34にnextポインタがあると思っている点です。
(私はx86のアセンブラが得意じゃないので、私が勘違いしている可能性もあります)
構造体の定義を見る限り0x40にnextポインタがあるべきです。

すいませんが確認のため
while( now_enter_enemy->next!=NULL ) {

now_enter_enemy->next = new_enter_enemy;

case 1: new_enter_enemy->pattern =atoi(inputc);break;
の部分のアセンブラコードを見せてもらえますか?

Re:ポインタエラー

Posted: 2009年11月10日(火) 23:48
by ひよこ
計算なんて、できるんですか。驚きです。
アセンブルのjpg2つです。

Re:ポインタエラー

Posted: 2009年11月11日(水) 00:11
by Poco
正直、こういったやり取りするより、問題をきちんと再現できる
ソースをいただけると、5分で解決すると思うのですが。。。

ひよこさんがNo:41640で添付しているソースだけでは、
コンパイルは通せても、実行ができません。

Re:ポインタエラー

Posted: 2009年11月11日(水) 00:16
by Justy

> 構造体の定義を見る限り0x40にnextポインタがあるべきです

 1つずれてます。
 angleは double1つなので、nextは 0x38かと。
 
 だとしても nextが 0x34となっているのは解せないですが。


# メンバ hpを認識していない(?)ような気がしますね。
一度リビルドしてみては?

Re:ポインタエラー

Posted: 2009年11月11日(水) 00:24
by softya
>計算なんて、できるんですか。驚きです。
簡単ですよ。
各変数のサイズを16進で足していくだけです。

が、構造体の計算で寝ぼけていたのが発覚。簡単だけど間違いやすいです。
struct enter_enemy_t
{
double x,y; 0x00,0x08
double angle; 0x10
double spd; 0x18
int state; 0x20
int knd; 0x24
int wait; 0x28
int pattern; 0x2c
int count; 0x30
int hp; 0x34
struct enter_enemy_t* next; 0x38 //次の要素へのポインタ
};
だとしてもnextポインタは0x34じゃなくて0x38だなぁ。

こっちでも追いかけてみたいのですが、データは龍神録のデータで動きますか?
違う部分があれば、そのデータも欲しいです。
ちょっと追いかけるのに手間が掛かるので明日というか午後になりますけど。

Re:ポインタエラー

Posted: 2009年11月11日(水) 10:47
by ひよこ
龍神録ののデータを使っているので絵のほうはいいのですが、
csvでenemy_data0.csvを使います。
/カウンタ,移動パターン,敵の種類,x座標,y座標,状態,待機時間
/cnt,pattern,knd,x,y,state,wait
60,2,0,200,40,0,80
60,1,0,200,40,0,80
60,3,0,200,40,0,80
60,4,0,200,40,0,80
60,5,0,200,40,0,80
60,6,0,200,40,0,80
60,7,0,200,40,0,80
60,8,0,200,40,0,80
60,9,0,200,40,0,80
60,10,0,200,40,0,80
60,10,0,200,40,0,80

Re:ポインタエラー

Posted: 2009年11月11日(水) 19:17
by softya
結論から言いますと私の環境VisualStudio2005だと異常ないです。
なので、Justyさんの提案どおり一度リビルドかクリーンしてからビルドを行ってみてください。
どう考えてもload.cppは古いヘッダでコンパイルされたままだと思われます。ソリューションにヘッダが追加されていない可能性もありますので、ソリューションを確認してください。

Re:ポインタエラー

Posted: 2009年11月11日(水) 19:31
by ひよこ
リビルドしたら成功して、引数の追加ができました。
Justyさん、softyaさん、ありがとうございました。

Re:ポインタエラー

Posted: 2009年11月11日(水) 19:58
by softya
ソリューションにヘッダはありましたか?
無い場合は、また同じ問題が起こりますよ。

Re:ポインタエラー

Posted: 2009年11月11日(水) 20:32
by ひよこ
ソリューションにヘッダはありましたか?
ソリューションエクスプローラにヘッダがあるってことですか?

Re:ポインタエラー

Posted: 2009年11月11日(水) 20:57
by softya
>ソリューションエクスプローラにヘッダがあるってことですか?
そうです。
struct.h
define.h
func.h
func2.h
function.h
gv.h
が全て登録されていますか?
されていないと自動的に更新を感知してコンパイルしてくれません。

Re:ポインタエラー

Posted: 2009年11月11日(水) 21:24
by ひよこ
func2.hはソースの中にないと思います。
hpを同じ方法で読み込もうとしたらいっきにおかしくなりました。勝手に敵が登録されたりします。
変なソースには見えませんが、
csv enemy_data1.csv

/カウンタ,移動パターン,敵の種類,x座標,y座標,状態,待機時間,敵のHP
/cnt,pattern,knd,x,y,state,wait,hp
60,2,0,200,40,0,80,1
60,1,0,200,40,0,80,2
60,3,0,200,40,0,80,3
60,4,0,200,40,0,80,4
60,5,0,200,40,0,80,5
60,6,0,200,40,0,80,6
60,7,0,200,40,0,80,7
60,8,0,200,40,0,80,8
60,9,0,200,40,0,80,9
60,10,0,200,40,0,80,10
60,10,0,200,40,0,80,11
load.cpp
void load_enemy_data(){
		int num,i,fp;
	char fname[32]={"../dat/csv/enemy_data1.csv"};
	int input[64];
	char inputc[64];

	//	実態を作る。
	enter_enemy_t *new_enter_enemy; 
	enter_enemy_t *now_enter_enemy;

	fp = FileRead_open(fname);//ファイル読み込み
	if(fp == NULL){
		printfDx("read error\n");
		return;
	}
	for(i=0;i<2;i++)//最初の2行読み飛ばす
		while(FileRead_getc(fp)!='\n');

	num=0;
	

	while(1){
		for(i=0;i<64;i++){
			inputc=input=FileRead_getc(fp);//1文字取得する
			if(inputc=='/'){//スラッシュがあれば
				while(FileRead_getc(fp)!='\n');//改行までループ
				i=-1;//カウンタを最初に戻して
				continue;
			}
			if(input==',' || input=='\n'){//カンマか改行なら
				inputc='\0';//そこまでを文字列とし
				break;
			}
			if(input==EOF){//ファイルの終わりなら
				goto EXFILE;//終了
			}
		}
		switch(num){
			case 0:		
				new_enter_enemy = new enter_enemy_t;
				new_enter_enemy->next=NULL;
				//	最初の処理なら。
				if( head_enter_enemy==NULL ) {
				//	最初の敵データ
				head_enter_enemy = new_enter_enemy;
				} 
				else
				{
				//	リストの最後を探す。
				now_enter_enemy = head_enter_enemy;
				while( now_enter_enemy->next!=NULL ) {
				now_enter_enemy = now_enter_enemy->next;
				}
				//	リストの最後に接続する。
				now_enter_enemy->next = new_enter_enemy;
				now_enter_enemy=NULL;
				}
				new_enter_enemy->count			=atoi(inputc);break;
			case 1:	new_enter_enemy->pattern	=atoi(inputc);break;
			case 2:	new_enter_enemy->knd		=atoi(inputc);break;
			case 3:	new_enter_enemy->x			=atof(inputc);break;
			case 4:	new_enter_enemy->y			=atof(inputc);break;
			case 5:	new_enter_enemy->state		=atof(inputc);break;
			case 6:	new_enter_enemy->wait		=atoi(inputc);break;
			case 7:	new_enter_enemy->hp			=atoi(inputc);break;
		}
		num++;
		if(num==8){
			num=0;
		}
	}
EXFILE:
	new_enter_enemy =NULL;
	now_enter_enemy=NULL;
	FileRead_close(fp);
}enemy.cpp
void enemy_enter(){
	enter_enemy_t *check_enemy = head_enter_enemy;
	enter_enemy_t *before_enemy = NULL;
	while( check_enemy != NULL ) {
		enter_enemy_t *next_enemy = check_enemy->next;//head_enemy->next
		if(check_enemy->count==stage_count) {
			enter_enemy(check_enemy->x,check_enemy->y,0,0,check_enemy->state,check_enemy->knd,check_enemy->pattern,check_enemy->wait,check_enemy->hp);
			//	削除
			if( before_enemy == NULL ) {//先頭か
				head_enter_enemy = next_enemy;//一回目だったら、NULLを、2回目以上はアドレスへつなぐ
			} else {
				before_enemy->next = next_enemy;
			}
			delete check_enemy;
		} else {//条件にひっかからなかったらそのアドレスをbefore_ememy
			before_enemy = check_enemy;
		}
		check_enemy = next_enemy;
	}
}
//softyaさん。
void enter_enemy(double x,double y,double angle,double spd,int state,int knd,int pattern,int wait,int hp){
	//	実態を作る。
	enemy_t *new_enemy; 

	new_enemy = new enemy_t;
	new_enemy->next=NULL;
	//	最初の処理なら。
	if( head_enemy==NULL ) {
	//	最初の敵データ
	head_enemy = new_enemy;
	} 
	else
	{
	//	リストの最後を探す。
	enemy_t *now_enemy = head_enemy;
	while( now_enemy->next!=NULL ) {
		now_enemy = now_enemy->next;
	}
	//	リストの最後に接続する。
	now_enemy->next = new_enemy;
	}	
	new_enemy->x=x;
	new_enemy->y=y;
	new_enemy->angle=angle;
	new_enemy->spd=spd;
	new_enemy->vx=0;
	new_enemy->vy=0;
	new_enemy->state=state;
	new_enemy->knd=knd;
	new_enemy->pattern=pattern;
	new_enemy->cnt=0;
	new_enemy->flag=1;
	new_enemy->muki=0;
	new_enemy->img=0;
	new_enemy->wait=wait;
	new_enemy->hp=hp;
}

Re:ポインタエラー

Posted: 2009年11月11日(水) 22:09
by softya
func2.hはともかく他のヘッダは登録されているのですね?
あとソースとヘッダを一式でください。
コンパイルを通す手間が大変です。

Re:ポインタエラー

Posted: 2009年11月11日(水) 22:12
by ひよこ
上のソースじゃなくて今困っているソースがほしいということですか?

Re:ポインタエラー

Posted: 2009年11月11日(水) 22:22
by softya
はい。問題のある最新をください。
問題を確かめるには、確実に同じもので無いと無駄手間になるからです。
それとヘッダの件も答えてくださいね。
>func2.hはともかく他のヘッダは登録されているのですね?

Re:ポインタエラー

Posted: 2009年11月11日(水) 23:29
by ひよこ
すみませんが、ひとつお聞きしますが、
同じソースで実行結果が違うっていうのはありえませんよね。
見た目が同じソースなのに実行結果が違いました。
9が成功したほうで9?が失敗です。

Re:ポインタエラー

Posted: 2009年11月11日(水) 23:34
by ひよこ
func2.hは使っていません。
他はちゃんと入ってます。

Re:ポインタエラー

Posted: 2009年11月12日(木) 01:11
by softya
すいません、また午後に調べます。

Re:ポインタエラー

Posted: 2009年11月12日(木) 01:18
by Justy

> 見た目が同じソースなのに実行結果が違いました

 見た目が同じでも細かい条件が違えば実行結果は異なります。
 といっても添付のソースを見た限りでは見た目いろいろ違うようですね。

 最大の違いは読み込んでる csv名が違います。

Re:ポインタエラー

Posted: 2009年11月12日(木) 06:37
by toyo
WinDiffで比較してみましたが違うのはload.cppとmain.cppだけでした。
main.cppのほうはコメントの違いだけでプログラム部分は同じです
違うのはload.cppで読み込むファイル名の0と1の違いだけですね

Re:ポインタエラー

Posted: 2009年11月12日(木) 07:21
by ひよこ
確かにcsvだけですね。直してみたらできました。
その部分は修正して直ったと思っていたんですが。ビルドしたのに。きっと操作ミスですよ。
なぜ、おかしくなったのかが気になります。
読み込みで、numが7になるまででcsvのデータは6個(enemy_data0.csv)しかないので、ひとつずつデータが
ずれていって敵一体分くらいおかしくなると思うのですが、実行結果は勝手に敵が登録されたり、見えない敵がたくさんいるようです。どうしてなんでしょうか?

Re:ポインタエラー

Posted: 2009年11月12日(木) 13:01
by softya
とりあえずリストを表示する処理を作りました。
EXFILE:

	now_enter_enemy = head_enter_enemy;
	while( now_enter_enemy != NULL ) {
		TCHAR str[256];
		_stprintf(str,TEXT("enter_enemy_ptr=%p count=%d pattern=%d knd=%d x=%f y=%f state=%d wait=%d hp=%d next=%p \n"),now_enter_enemy,
		now_enter_enemy->count,
		now_enter_enemy->pattern,
		now_enter_enemy->knd,
		now_enter_enemy->x,
		now_enter_enemy->y,
		now_enter_enemy->state,
		now_enter_enemy->wait,
		now_enter_enemy->hp,
		now_enter_enemy->next);
		OutputDebugString( str );
		now_enter_enemy = now_enter_enemy->next;
	}
私の環境での実行結果。
enter_enemy_ptr=01CF4C78 count=60 pattern=2 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=01CF4CF8
enter_enemy_ptr=01CF4CF8 count=1 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=3 next=01CF4D78
enter_enemy_ptr=01CF4D78 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=60 wait=4 hp=0 next=01CF4DF8
enter_enemy_ptr=01CF4DF8 count=200 pattern=40 knd=0 x=80.000000 y=60.000000 state=5 wait=0 hp=200 next=01CF4E78
enter_enemy_ptr=01CF4E78 count=40 pattern=0 knd=80 x=60.000000 y=6.000000 state=0 wait=200 hp=40 next=01CF4EF8
enter_enemy_ptr=01CF4EF8 count=0 pattern=80 knd=60 x=7.000000 y=0.000000 state=200 wait=40 hp=0 next=01CF4F78
enter_enemy_ptr=01CF4F78 count=80 pattern=60 knd=8 x=0.000000 y=200.000000 state=40 wait=0 hp=80 next=01CF4FF8
enter_enemy_ptr=01CF4FF8 count=60 pattern=9 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=01CF5078
enter_enemy_ptr=01CF5078 count=10 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=10 next=01CF50F8
enter_enemy_ptr=01CF50F8 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=-842150451 wait=-842150451 hp=-842150451 next=00000000

なぜ、このリストでおかしくなるかは自分でトレースしてみてください。

Re:ポインタエラー

Posted: 2009年11月12日(木) 14:08
by ひよこ
%pはポインタを表すのですか・・・%dとは違いますね。
トレースって処理を追いかけるってことですよね、
patternで関数ポインタがおかしくなって、きっとポインタがほかのアドレスを書き変えたりして、
いるんでしょうか?

Re:ポインタエラー

Posted: 2009年11月12日(木) 15:44
by softya
>%pはポインタを表すのですか・・・%dとは違いますね。
%pはポインタです。

>トレースって処理を追いかけるってことですよね、
そうです。

>patternで関数ポインタがおかしくなって、きっとポインタがほかのアドレスを書き変えたりして、
いるんでしょうか?
ENEMY_PATTERN_MAXでガードが掛かっているので大丈夫じゃないですか?
安易な想像をめぐらせず、ちゃんと調べてみましょう。
ちなみに、関数ポインタ配列の添え字外をアクセスして関数でないアドレスを関数として呼び出そうとしたら、ほぼ100%例外で異常終了します。試しにENEMY_PATTERN_MAXのガードを外して見たら分かります。

>きっとポインタがほかのアドレスを書き変えたりしているんでしょうか?
何が何を書き換えると言うのでしょう?
ポインタを読み出しているだけでは何もおきません。
書き換えるとしたらポインタを使った代入処理の部分です。
なので、リスト構造体の変数を書き換えている部分で、リスト構造体のポインタが異常な値なら異常な書き換えが起こりますが、それ以外の場合は大丈夫です。
ゲーム機(ファミコンやPSP)等と違い大半はOSがガードしてくれますよ。

Re:ポインタエラー

Posted: 2009年11月12日(木) 16:15
by ひよこ
どんなことが起きているかわからないので、softyaさんのソースをenemy_enter()に組み込んでみたら、
明らかに、csvのデータ数とは違う数が出てきました。
やっぱりcsvの読み込み一つでここまで変わるもんですね。

enter_enemy_ptr=02191288 count=60 pattern=2 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191308
enter_enemy_ptr=02191308 count=1 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=3 next=02191388
enter_enemy_ptr=02191388 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=60 wait=4 hp=0 next=02191408
enter_enemy_ptr=02191408 count=200 pattern=40 knd=0 x=80.000000 y=60.000000 state=5 wait=0 hp=200 next=02191488
enter_enemy_ptr=02191488 count=40 pattern=0 knd=80 x=60.000000 y=6.000000 state=0 wait=200 hp=40 next=02191508
enter_enemy_ptr=02191508 count=0 pattern=80 knd=60 x=7.000000 y=0.000000 state=200 wait=40 hp=0 next=02191588
enter_enemy_ptr=02191588 count=80 pattern=60 knd=8 x=0.000000 y=200.000000 state=40 wait=0 hp=80 next=02191608
enter_enemy_ptr=02191608 count=60 pattern=9 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191688
enter_enemy_ptr=02191688 count=10 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=10 next=02191708
enter_enemy_ptr=02191708 count=0 pattern=200 knd=40 x=0.000000 y=80.000000 state=-842150451 wait=-842150451 hp=-842150451 next=00000000
enter_enemy_ptr=02191308 count=1 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=3 next=02191388
enter_enemy_ptr=02191688 count=10 pattern=0 knd=200 x=40.000000 y=0.000000 state=80 wait=60 hp=10 next=02191708
enter_enemy_ptr=02191488 count=40 pattern=0 knd=80 x=60.000000 y=6.000000 state=0 wait=200 hp=40 next=02191508
enter_enemy_ptr=02191288 count=60 pattern=2 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191388
enter_enemy_ptr=02191608 count=60 pattern=9 knd=0 x=200.000000 y=40.000000 state=0 wait=80 hp=60 next=02191708
enter_enemy_ptr=02191588 count=80 pattern=60 knd=8 x=0.000000 y=200.000000 state=40 wait=0 hp=80 next=02191708
enter_enemy_ptr=02191408 count=200 pattern=40 knd=0 x=80.000000 y=60.000000 state=5 wait=0 hp=200 next=02191508