メモリアクセスエラーをどうにかしたい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

メモリアクセスエラーをどうにかしたい。

#1

投稿記事 by G.G. » 8年前

急用です。初歩的ミスかも知れませんが。。。

エラーはおそらくpoint.cpp内で起きていて、point_order[]からpoint[]に値を移しているときに起きているみたいです。
関数はvoid point_enter()です。

プログラムのソースにコメントが書かれていませんが、竜神禄を元にしているので分かるはずです。

説明不足で無茶振りですが、助けてください。お願いします!(><;)
最後に編集したユーザー G.G. on 2011年12月31日(土) 09:15 [ 編集 1 回目 ]

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#2

投稿記事 by G.G. » 8年前

point_order[]とpoint[]が関わっているソースを載せます。

コード:

#include "DxLib.h"
#include "Point.h"
#include "Pointload.h"
#include "Point_orbit.h"

extern void (*point_orbit[POINT_ORBIT_MAX])(move_t *move,int cnt);
extern point_order_t point_order[POINT_MAX];
point_t point[POINT_GRAPH_MAX];
int nowcnt;
int ButtomGHandle[4];

void Ini_ButtomGraph(){
	LoadDivGraph( "graph/ButtomM.png" , 4 , 2 , 2 , 30 , 30 , ButtomGHandle ) ;
}

void test2(){
	DrawGraph(0,50,ButtomGHandle[0],TRUE);
	DrawGraph(30,50,ButtomGHandle[1],TRUE);
	DrawGraph(60,50,ButtomGHandle[2],TRUE);
	DrawGraph(90,50,ButtomGHandle[3],TRUE);
}


void Ini_Pointmain(){
	nowcnt=0;
	Ini_ButtomGraph();
}

void nowcnt_calc(){
	nowcnt++;
}


int point_num_search(){
	for(int i=0;i<POINT_GRAPH_MAX;i++){//フラグのたって無いenemyを探す
                if(point[i].flag==0){
                        return i;//使用可能番号を返す
                }
        }
        return -1;//全部埋まっていたらエラーを返す
}


void point_enter(){
	int i,t;
	for(t=0;t<POINT_MAX;t++){
		if(point_order[t].Hittime-point_order[t].passtime==nowcnt){
			if((i=point_num_search())!=-1){
				point[i].flag	=1;
				point[i].cnt	=0;
				point[i].orbit	=point_order[t].orbit;
				point[i].x		=point_order[t].x;
				point[i].y		=point_order[t].y;
				point[i].Hittime=point_order[t].Hittime;
				point[i].Pushcnt=point_order[t].Pushcnt;
				point[i].sx		=point_order[t].x-point_order[t].d.x;
				point[i].sy		=point_order[t].y-point_order[t].d.y;
			}
		}

	}
}


void point_act(){
	int i;
	for(i=0;i<POINT_GRAPH_MAX;i++){
		if(point[i].flag==1){
			point_orbit[point[i].orbit](&point[i].d,point[i].cnt);
			point[i].px=point[i].sx+point[i].d.x;
			point[i].py=point[i].sy+point[i].d.y;
			point[i].cnt++;
			if(nowcnt>point[i].Hittime&&(point[i].px<-20||point[i].px>FX||point[i].py<-20||point[i].py>FY)){
				point[i].flag=0;
			}
		}
	}
}

void point_graph(){
	int i;
	for(i=0;i<POINT_GRAPH_MAX;i++){
		if(point[i].flag==1){
			DrawRotaGraphF( (float)point[i].px , (float)point[i].py , 1.0f , 0.0 , ButtomGHandle[0] , TRUE ) ;
		}
	}
}

void test3(){
	DrawFormatString(0,45,GetColor(255,255,255),"nowcnt = %d ",nowcnt);
	DrawFormatString(0,60,GetColor(255,255,255),"frag = %d ",point[0].flag);
}

void Point_main(){
	nowcnt_calc();
	point_enter();
	point_act();
	point_graph();

	test3();

}

コード:

#include "DxLib.h"
#include "Pointload.h"
#include "Point_orbit.h"
#include "Gstruct.h"

point_order_t point_order[POINT_MAX];

void (*point_orbit[POINT_ORBIT_MAX])(move_t *move,int cnt) = {
    point_orbit0,    point_orbit1,
};


void load_test(){
        int n,num,i,fp;
        char fname[36]={"scoredate/White Reflection/test.csv"};
        int input[64];
        char inputc[64];

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

        n=0 , num=0;
        while(1){
                for(i=0;i<64;i++){
                        inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
                        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: point_order[n].Hittime	=atoi(inputc);break;
                        case 1: point_order[n].orbit	=atoi(inputc);break;
                        case 2: point_order[n].x		=atof(inputc);break;
                        case 3: point_order[n].y		=atof(inputc);break;
                        case 4: point_order[n].passtime	=atoi(inputc);break;
                        case 5: point_order[n].Pushcnt	=atoi(inputc);break;
                        case 6: point_order[n].Buttom	=atoi(inputc);break;
						case 7: point_order[n].d.x		=0.0;break;
						case 8: point_order[n].d.y		=0.0;break;
						case 9: point_order[n].cnt		=0;break;
                }
                num++;
                if(num==9){
                        num=0;
                        n++;
                }
        }
EXFILE:
        FileRead_close(fp);
}





void load_score(){
	int n,num;
	n=0,num=0;
	while(1){
		switch(num){
		case 0:point_order[n].x=200;break;
		case 1:point_order[n].y=240;break;
		case 2:point_order[n].passtime=120;break;
		case 3:point_order[n].Hittime=180;break;
		case 4:point_order[n].d.x=0;break;
		case 5:point_order[n].d.y=0;break;
		case 6:point_order[n].cnt=0;break;
		case 7:point_order[n].Pushcnt=0;break;
		case 8:point_order[n].orbit=0;break;
		}
		num++;
		if(num==8)break;
	}
}

void Calc_Pointdis(){
	int n;
	n=0;
	while(1){
		point_orbit[point_order[n].orbit](&point_order[n].d,point_order[n].cnt);
		point_order[n].cnt++;
		if(point_order[n].cnt==point_order[n].passtime)break;
	}
}

void test(){
	DrawFormatString(0,0,GetColor(255,255,255),"X変位 %f 、Y変位 %f ",point_order[0].d.x,point_order[0].d.y);
	DrawFormatString(0,15,GetColor(255,255,255),"point_order[0].passtime = %d",point_order[0].passtime);
	DrawFormatString(0,30,GetColor(255,255,255),"point_order[0].cnt = %d",point_order[0].cnt);
}

アバター
a5ua
記事: 199
登録日時: 9年前

Re: メモリアクセスエラーをどうにかしたい。

#3

投稿記事 by a5ua » 8年前

csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
if(num==7){
となるべきではないでしょうか

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#4

投稿記事 by beatle » 8年前

G.G. さんが書きました:エラーはおそらくpoint.cpp内で起きていて、point_order[]からpoint[]に値を移しているときに起きているみたいです。
関数はvoid point_enter()です。
恐らくエラーメッセージからそう判断したのだと思いますが,とりあえず正確なエラーメッセージを全部載せませんか?
G.G. さんが書きました:プログラムのソースにコメントが書かれていませんが、竜神禄を元にしているので分かるはずです。
この掲示板の人が全員龍神録に詳しいわけではありません.

開発環境に何を使っているかは知りませんが,Visual Studioだとすると使いやすいデバッガが付属しておりますので,
とりあえず,デバッガでプログラムの動作を1行ずつ追いかけて原因を探しましょう.

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#5

投稿記事 by G.G. » 8年前

>a5uaさん
>csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
>if(num==7){
>となるべきではないでしょうか

確かにcsvからは7つの情報しか読み込んでいませんが、下の3つ分は初期化分を兼ねています。(まだ初期化関数を作っていないので)
試しにnum==7にして別のところでpoint_order[].dとcntを初期化しましたが、起動直後エラーが出ました。

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#6

投稿記事 by G.G. » 8年前

"a5uaさん
"csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
"if(num==7){
"となるべきではないでしょうか

確かにcsvからは7つの情報しか読み込んでいませんが、下の3つ分は初期化分を兼ねています。(まだ初期化関数を作っていないので)
試しにnum==7にして別のところでpoint_order[].dとcntを初期化しましたが、起動直後エラーが出ました。

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#7

投稿記事 by G.G. » 8年前

↑2つあるのは気にしないでください(ミスです

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#8

投稿記事 by beatle » 8年前

引用したいのならば,「引用」ボタンを押して編集ページに移動するか,直接quoteタグを使いましょう.

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#9

投稿記事 by G.G. » 8年前

>beatleさん
開発ソフトはvisual C++を使っています。

デバッグ出力

コード:

GameProg.exe の 0x008d1010 で初回の例外が発生しました: 0xC0000005: 場所 0xd3c96582 に書き込み中にアクセス違反が発生しました。
GameProg.exe の 0x008d1010 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xd3c96582 に書き込み中にアクセス違反が発生しました。
自動変数(原因だと思うところを抜粋)
Hittime 320 int
orbit 240 int(おそらくこれで軌道計算するときに引っかかりました)
x 200.00000000000000 double
y 0.00000000000000000 double
px 0.00000000000000000 double
py 0.00000000000000000 double
sx 200.00000000000000 double
sy 0.00000000000000000 double
- d {x=0.00000000000000000 y=0.00000000000000000 } move_t

どう見たって、point_order[0]からpoint[0]へ正しく値を移せていない状況です。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#10

投稿記事 by beatle » 8年前

1行ずつステップ実行すると何行目でエラーが出ているか分かると思います.何行目ですか?

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#11

投稿記事 by G.G. » 8年前

point.cpp 69行目です。
軌道計算部分です・・・。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#12

投稿記事 by beatle » 8年前

POINT_ORBIT_MAXが幾つかのかは分かりませんが,point.orbitがPOINT_ORBIT_MAX未満になっていないとダメなのは分かりますか?

コード:

point_orbit[point[i].orbit]
というふうに配列アクセスしており,配列を超えてアクセスしているのではないかと推測しました.

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#13

投稿記事 by G.G. » 8年前

まあ、それは分かっています。
ですが、それ以前にpoint[0].orbitに240という数字が入るのがおかしいと思うのです。

コード:

void point_enter(){
	int i,t;
	for(t=0;t<POINT_MAX;t++){
		if(point_order[t].Hittime-point_order[t].passtime==nowcnt){
			if((i=point_num_search())!=-1){
				point[i].flag	=1;
				point[i].cnt	=0;
				point[i].orbit	=point_order[t].orbit;
				point[i].x		=point_order[t].x;
				point[i].y		=point_order[t].y;
				point[i].Hittime=point_order[t].Hittime;
				point[i].Pushcnt=point_order[t].Pushcnt;
				point[i].sx		=point_order[t].x-point_order[t].d.x;
				point[i].sy		=point_order[t].y-point_order[t].d.y;
			}
		}

	}
}
このときにpoint_order[0].orbitは0となっています。
でも移したときにはpoint_order[0].yの値(240)が入っているのです。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#14

投稿記事 by beatle » 8年前

この問題は既にa5uaさんが指摘されている問題に深く関連しています.
まさにcsvファイルでは1行に7項目しかないのに

コード:

if(num==9){
    num=0;
    n++;
}
とやっているのがまずいです.

アバター
G.G.
記事: 63
登録日時: 9年前
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#15

投稿記事 by G.G. » 8年前

・・・num==7にしたところ、
正常に動きました・・・。

a5uaさん、アドバイスしてもらってながらすみませんでした!(やり方が間違ってた
beatleさん、自分の駄々に付き合ってもらってありがとうございました!

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: メモリアクセスエラーをどうにかしたい。

#16

投稿記事 by beatle » 8年前

龍神録のCSV読み込みプログラムは改行とカンマを同じように扱っており,ちょっと良くないプログラムですから,G.G.さんなりに改良すると良いと思います.
実のところ,あのCSV読み込みプログラムは改行を入れず,1行にカンマ区切りだけでつめ込んでも,逆にカンマを使わずに全部改行区切りにしても,1行の要素数がばらばらでも関係ないプログラムになっています.
それが便利なこともありますが,そうでない場合もあります.
CSVの各行の要素数が違っていたらメッセージを出して教えるなり,警告を出すなりしたら親切かもしれませんね.

閉鎖

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