今まではゲーム開始前(タイトル、オプション、ランキング、キャラセレクト)をまとめてtitle.cppに書いていたのですが、
色々と変更をして長くなってきたのでタイトルと起動時の初期化をmain.cppに、ほかはOption.cpp(オプション)、rank.cpp(ランキング),Select.cpp(キャラ、ステージ選択),save.cpp(ファイルの読み込みと書き込み)というように変更しました。
そのようにしたらなぜかゲームが起動してもすぐに閉じるようになりました。
おそらくsave.cppのvoid RankSaveData()でうまくファイルを読み込んでないのが問題なのだと思うのですが、
の内容はまったくいじってないため原因がさっぱりわかりません。ちゃんとblocktower2内にranking.csvのファイルもあります。どなたか原因のわかる人教えてください。お願いします。
ソースは下記のサイトにアップしました。パスワードは「YT2013」です。
http://www1.axfc.net/uploader/so/2857782
もうひとつついでに聞いておきたいのですが
今回のは元々龍神録を参考にしていたため関数をfunction.hにすべてまとめていますが、ソースファイルごとにヘッダーファイルを作成したほうがよいのでしょうか。
ファイルを読み込まなくなった?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ファイルを読み込まなくなった?
まず、前から言ってますがデバッガで追いかけるべきだと思います。
すでに規模が大きいので他の人が追いかけるのが難しくなってきています。
>今回のは元々龍神録を参考にしていたため関数をfunction.hにすべてまとめていますが、ソースファイルごとにヘッダーファイルを作成したほうがよいのでしょうか。
一般的には、メンテ性が高いのでそうします。
すでに規模が大きいので他の人が追いかけるのが難しくなってきています。
>今回のは元々龍神録を参考にしていたため関数をfunction.hにすべてまとめていますが、ソースファイルごとにヘッダーファイルを作成したほうがよいのでしょうか。
一般的には、メンテ性が高いのでそうします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ファイルを読み込まなくなった?
>エラーが生じたときに、ただ単にexitするのではなく、メッセージを表示させて終わりましょう。
ちょっと変更した際にprintfを消してました。
>まず、前から言ってますがデバッガで追いかけるべきだと思います。
すみません。最初に聞いておいておくべきだったのですが、デバッグ(D)とデバッガって違うんですが。
一応、ReadSaveData()をコメントにしたときはちゃんと起動したので原因はここにあると思い、
(1)~(4)にブレークポイントをつけてデバッグを開始して、(1)のところにつけたとき
fpのところで「CXX0030: エラーです: 式を評価できません」と出てきました。
それでも解決方法がわかりませんでした。
ちょっと変更した際にprintfを消してました。
>まず、前から言ってますがデバッガで追いかけるべきだと思います。
すみません。最初に聞いておいておくべきだったのですが、デバッグ(D)とデバッガって違うんですが。
一応、ReadSaveData()をコメントにしたときはちゃんと起動したので原因はここにあると思い、
void ReadSaveData(){
FILE *fp = fopen(("ranking.csv"),"rb"); //(1)
int i = 0;
if(fp == NULL)//(2)
{
printf("cannot open csv.\n");
exit(1);
}
while(!feof(fp) && !ferror(fp))//04
{
if(i==0){
fscanf( fp, "%d",&buff1);//i=i+1;
clearnumber = buff1;
}else{
/* csvから、10進整数、文字列、小数を読み込む */
fscanf( fp, "%s,%d",buff2, &buff3); //(3)
strcpy(name[i-1],buff2); //(4)
point[i-1] = buff3;
}
i++;
}
fclose(fp);
//LoadRank(point,name);
}
fpのところで「CXX0030: エラーです: 式を評価できません」と出てきました。
それでも解決方法がわかりませんでした。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ファイルを読み込まなくなった?
デバッグをするための方法の1つがデバッガでVC++には標準で含まれています。
まぁ、ようするにブレークポイントとステップ実行で追いかけましょうと言う話です。
(1)の処でブレークしたらfpはまだ不定なので、「CXX0030: エラーです: 式を評価できません」が正解です。
ブレークは実行前ブレークですので注意してください。
まぁ、ようするにブレークポイントとステップ実行で追いかけましょうと言う話です。
(1)の処でブレークしたらfpはまだ不定なので、「CXX0030: エラーです: 式を評価できません」が正解です。
ブレークは実行前ブレークですので注意してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ファイルを読み込まなくなった?
クリアしたステージから始められるようにranking.csvの中身を
1
NONAME,10000
NONAME,9000
(省略)
NONAME,1000
というように変更してたのですが、
クリアしたステージ数,1
名前,点数
NONAME,10000
NONAME,9000
(省略)
NONAME,1000
というように変え、ソースコードを
というように変更したら、ちゃんと起動するようになりました。
ファイルを読み込むとき1行で読み込む変数の数がすべて同じでないといけないのですか?
1
NONAME,10000
NONAME,9000
(省略)
NONAME,1000
というように変更してたのですが、
クリアしたステージ数,1
名前,点数
NONAME,10000
NONAME,9000
(省略)
NONAME,1000
というように変え、ソースコードを
static int buff2,buff6;
static char buff1[10],buff3[10],buff4[10],buff5[10];
static int clearnumber = 0; //クリアしたステージ数
static int point[11]; //ランキングの点数
static char name[10][10]; //ランキングの名前
void ReadSaveData(){
FILE *fp = fopen(("ranking.csv"),"rb");
int i = 0;
if(fp == NULL)
{
printf("cannot open csv.\n");
exit(1);
}
while(!feof(fp) && !ferror(fp))//04
{
if(i==0){
fscanf( fp, "%s,%d",buff1,buff2);//i=i+1;
clearnumber = buff2;
}else if(i ==1){
fscanf( fp, "%s,%s",buff3,buff4);
}else{
/* csvから、10進整数、文字列、小数を読み込む */
fscanf( fp, "%s,%d",buff5, &buff6);
strcpy(name[i-1],buff5);
point[i-1] = buff6;
}
i++;
}
fclose(fp);
//LoadRank(point,name);
}
ファイルを読み込むとき1行で読み込む変数の数がすべて同じでないといけないのですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ファイルを読み込まなくなった?
そんな事はありません。
あと、ここバグです。
fscanf( fp, "%s,%d",buff1,buff2);//i=i+1; → fscanf( fp, "%s,%d",buff1,&buff2);//i=i+1;
バグっているのに問題なく動いているとしたら不思議です。
【補足】buff1,buff2などの適当な名前を付けているとミスしやすので、ちゃんと変数名を付けましょう。
あと、ここバグです。
fscanf( fp, "%s,%d",buff1,buff2);//i=i+1; → fscanf( fp, "%s,%d",buff1,&buff2);//i=i+1;
バグっているのに問題なく動いているとしたら不思議です。
【補足】buff1,buff2などの適当な名前を付けているとミスしやすので、ちゃんと変数名を付けましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ファイルを読み込まなくなった?
新・ゲームプログラミングの館を参考に
まず、SaveData.datを作成してから、
freadを使って読み込むように変えました。ランキング用のデータは
構造体RANKDATAを作り というようにして、読み込みのプログラムを
というように直しました。
新・ゲームプログラミングの館だと構造体を使っていたのでfreadの場合、1行から複数の項目を読み込むとき
構造体を使わないといけないのかと思ったのですが実際のところどうなのですか?
さすがに2項目だけで構造体を作るのもどうかと思ったので質問してみました。
まず、SaveData.datを作成してから、
freadを使って読み込むように変えました。ランキング用のデータは
構造体RANKDATAを作り というようにして、読み込みのプログラムを
void ReadSaveData(){
FILE *fp = fopen(("SaveData1.dat"),"rb");
int i = 0;
if(fp == NULL)
{
printf("cannot open dat.\n");
exit(1);
}
while(!feof(fp) && !ferror(fp))//04
{
if(i==0){
fread( &clearnumber, sizeof(clearnumber),1,fp);//i=i+1;
}else{
/* csvから、10進整数、文字列、小数を読み込む */
fread( &Data, sizeof(Data),1,fp);
}
i++;
}
fclose(fp);
for(int j = 0;j<10;j++){
LoadRank(Data[j].point,Data[j].name,j);
}
}
新・ゲームプログラミングの館だと構造体を使っていたのでfreadの場合、1行から複数の項目を読み込むとき
構造体を使わないといけないのかと思ったのですが実際のところどうなのですか?
さすがに2項目だけで構造体を作るのもどうかと思ったので質問してみました。
Re: ファイルを読み込まなくなった?
構造体にしておけば、後で項目増えても構造体への追加ですみますが、バラバラにすれば項目ごとの処理を書く必要が出てくるのではないでしょうか。
読み取りにしろ書き出すにしろ、そういう処理をするデータなら、そういう名前の構造体なり変数なりに纏めたりしたほうが分かりやすいはずです。
以上の2つの理由から構造体にしたほうが良いと私は思います。
読み取りにしろ書き出すにしろ、そういう処理をするデータなら、そういう名前の構造体なり変数なりに纏めたりしたほうが分かりやすいはずです。
以上の2つの理由から構造体にしたほうが良いと私は思います。