メモリアクセスエラーをどうにかしたい。
メモリアクセスエラーをどうにかしたい。
急用です。初歩的ミスかも知れませんが。。。
エラーはおそらくpoint.cpp内で起きていて、point_order[]からpoint[]に値を移しているときに起きているみたいです。
関数はvoid point_enter()です。
プログラムのソースにコメントが書かれていませんが、竜神禄を元にしているので分かるはずです。
説明不足で無茶振りですが、助けてください。お願いします!(><;)
エラーはおそらくpoint.cpp内で起きていて、point_order[]からpoint[]に値を移しているときに起きているみたいです。
関数はvoid point_enter()です。
プログラムのソースにコメントが書かれていませんが、竜神禄を元にしているので分かるはずです。
説明不足で無茶振りですが、助けてください。お願いします!(><;)
最後に編集したユーザー G.G. on 2011年12月31日(土) 09:15 [ 編集 1 回目 ]
Re: メモリアクセスエラーをどうにかしたい。
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);
}
Re: メモリアクセスエラーをどうにかしたい。
csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
if(num==7){
となるべきではないでしょうか
if(num==7){
となるべきではないでしょうか
Re: メモリアクセスエラーをどうにかしたい。
恐らくエラーメッセージからそう判断したのだと思いますが,とりあえず正確なエラーメッセージを全部載せませんか?G.G. さんが書きました:エラーはおそらくpoint.cpp内で起きていて、point_order[]からpoint[]に値を移しているときに起きているみたいです。
関数はvoid point_enter()です。
この掲示板の人が全員龍神録に詳しいわけではありません.G.G. さんが書きました:プログラムのソースにコメントが書かれていませんが、竜神禄を元にしているので分かるはずです。
開発環境に何を使っているかは知りませんが,Visual Studioだとすると使いやすいデバッガが付属しておりますので,
とりあえず,デバッガでプログラムの動作を1行ずつ追いかけて原因を探しましょう.
Re: メモリアクセスエラーをどうにかしたい。
>a5uaさん
>csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
>if(num==7){
>となるべきではないでしょうか
確かにcsvからは7つの情報しか読み込んでいませんが、下の3つ分は初期化分を兼ねています。(まだ初期化関数を作っていないので)
試しにnum==7にして別のところでpoint_order[].dとcntを初期化しましたが、起動直後エラーが出ました。
>csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
>if(num==7){
>となるべきではないでしょうか
確かにcsvからは7つの情報しか読み込んでいませんが、下の3つ分は初期化分を兼ねています。(まだ初期化関数を作っていないので)
試しにnum==7にして別のところでpoint_order[].dとcntを初期化しましたが、起動直後エラーが出ました。
Re: メモリアクセスエラーをどうにかしたい。
"a5uaさん
"csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
"if(num==7){
"となるべきではないでしょうか
確かにcsvからは7つの情報しか読み込んでいませんが、下の3つ分は初期化分を兼ねています。(まだ初期化関数を作っていないので)
試しにnum==7にして別のところでpoint_order[].dとcntを初期化しましたが、起動直後エラーが出ました。
"csvのパラメータは1行あたり7個なので、Pointload.cppの57行目は
"if(num==7){
"となるべきではないでしょうか
確かにcsvからは7つの情報しか読み込んでいませんが、下の3つ分は初期化分を兼ねています。(まだ初期化関数を作っていないので)
試しにnum==7にして別のところでpoint_order[].dとcntを初期化しましたが、起動直後エラーが出ました。
Re: メモリアクセスエラーをどうにかしたい。
引用したいのならば,「引用」ボタンを押して編集ページに移動するか,直接quoteタグを使いましょう.
Re: メモリアクセスエラーをどうにかしたい。
>beatleさん
開発ソフトはvisual C++を使っています。
デバッグ出力
自動変数(原因だと思うところを抜粋)
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]へ正しく値を移せていない状況です。
開発ソフトは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]へ正しく値を移せていない状況です。
Re: メモリアクセスエラーをどうにかしたい。
1行ずつステップ実行すると何行目でエラーが出ているか分かると思います.何行目ですか?
Re: メモリアクセスエラーをどうにかしたい。
point.cpp 69行目です。
軌道計算部分です・・・。
軌道計算部分です・・・。
Re: メモリアクセスエラーをどうにかしたい。
まあ、それは分かっています。
ですが、それ以前にpoint[0].orbitに240という数字が入るのがおかしいと思うのです。
このときにpoint_order[0].orbitは0となっています。
でも移したときにはpoint_order[0].yの値(240)が入っているのです。
ですが、それ以前に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].yの値(240)が入っているのです。
Re: メモリアクセスエラーをどうにかしたい。
・・・num==7にしたところ、
正常に動きました・・・。
a5uaさん、アドバイスしてもらってながらすみませんでした!(やり方が間違ってた
beatleさん、自分の駄々に付き合ってもらってありがとうございました!
正常に動きました・・・。
a5uaさん、アドバイスしてもらってながらすみませんでした!(やり方が間違ってた
beatleさん、自分の駄々に付き合ってもらってありがとうございました!
Re: メモリアクセスエラーをどうにかしたい。
龍神録のCSV読み込みプログラムは改行とカンマを同じように扱っており,ちょっと良くないプログラムですから,G.G.さんなりに改良すると良いと思います.
実のところ,あのCSV読み込みプログラムは改行を入れず,1行にカンマ区切りだけでつめ込んでも,逆にカンマを使わずに全部改行区切りにしても,1行の要素数がばらばらでも関係ないプログラムになっています.
それが便利なこともありますが,そうでない場合もあります.
CSVの各行の要素数が違っていたらメッセージを出して教えるなり,警告を出すなりしたら親切かもしれませんね.
実のところ,あのCSV読み込みプログラムは改行を入れず,1行にカンマ区切りだけでつめ込んでも,逆にカンマを使わずに全部改行区切りにしても,1行の要素数がばらばらでも関係ないプログラムになっています.
それが便利なこともありますが,そうでない場合もあります.
CSVの各行の要素数が違っていたらメッセージを出して教えるなり,警告を出すなりしたら親切かもしれませんね.