下のコードでどこを、どのようにしたらいいか見当がつきません。 動けばいいんじゃないのという人もいると思いますが、今mallocの使い方を勉強しています。直しようがないというのであれば、教えていただきたいのです。 コードの書き方で直したほうがいいところがあれば、それも教えてください。 よろしくおねがいいたします。 コード // ラックナンバーサーチ・トレーニング 正常動作 #include <stdio.h> #include <time.h> #include <float.h> #include <stdlib.h> #define MAXCNT 100 char dtfile[]="LACKNUM.DAT"; char dtfile2[]="LACKNUM2.DAT";// 最高記録用のファイル typedef struct{ int tm_year; int tm_mon; int tm_mday; int tm_hour; int tm_min; int tm_sec; double score; }TIME_DATA; //--- 前回までのトレーニング情報の最高得点を返す --- void get_data2(int *count) { FILE *fp; FILE *fp2; int i; int year, mon, mday, hour, min, sec; double score; double bestscore; // 最高得点 TIME_DATA stars[MAXCNT]; // 構造体配列の宣言 if ((fp=fopen(dtfile,"rb"))==NULL){ printf("本プログラムを実行するのは初めてですね。\n\n"); bestscore = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ exit(1); } else { for(i=0; i<MAXCNT; i++){ if(fscanf(fp, "%d %d %d %d %d %d %lf\n" , // 構造体配列への読み込み &stars[i].tm_year,&stars[i].tm_mon,&stars[i].tm_mday, &stars[i].tm_hour,&stars[i].tm_min,&stars[i].tm_sec,&stars[i].score)!=7) break; (*count)++; } printf("\ncount01:%d\n\n",*count); printf("前回の終了は%d年 %d月 %d日 %d時 %d分 %d秒 で\n\n", // 構造体配列への読み出し stars[*count-1].tm_year,stars[*count-1].tm_mon,stars[*count-1].tm_mday,stars[*count-1].tm_hour, stars[*count-1].tm_min,stars[*count-1].tm_sec,stars[*count-1].score); fflush(stdout); fclose(fp); } if ((fp2=fopen(dtfile2,"rb"))==NULL) { printf("本プログラムを実行するのは初めてですね。\n\n"); bestscore=DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ exit(1); } else { fscanf(fp2, "%d%d%d%d%d%d", &year, &mon, &mday, &hour, &min, &sec); fscanf(fp2, "%lf", &bestscore); // stream(fp)が指すストリームから&bestに読み込む //fscanf 関数は format が指す書式文字列に従って //stream(fp) が指すストリームからデータを読込み, //format(&year, &month, &day, &h, &m, &s) に続く引数の指すオブジェクトに代入します. printf("前回までの最高得点(最短所要時間)は%d年%d月%d日%d時%d分%d秒で\n", year, mon, mday, hour, min, sec); fflush(stdout); printf("これまでの最高得点(最短所要時間)は%.1f秒です。\n\n", bestscore); // 画面が一瞬で消えてしまうのを防止 // 一瞬で画面が消えてしまう場合には、//getchar(); // 以下の文を入力します。 fflush(stdout); fclose(fp2); } } //■過去の履歴は. double kako_rireki(int* count,double* p,double* q) { FILE *fp; int i; TIME_DATA stars[MAXCNT]; // 構造体配列の宣言 if((fp=fopen(dtfile, "rb"))==NULL){ printf( "ファイルがオープンできません\n" ); exit( 1 ); } for(i=0; i<MAXCNT; i++){ if(fscanf(fp, "%d %d %d %d %d %d %lf\n" // 構造体配列への読み込み , &stars[i].tm_year,& stars[i].tm_mon, &stars[i].tm_mday, &stars[i].tm_hour, &stars[i].tm_min,&stars[i].tm_sec,&stars[i].score)!=7) break; } printf("\ncount0:%d\n\n",*count); printf("\n■過去の履歴は................\n\n"); for(i=0; i<*count; i++){ printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n所要時間(score)は%.1f\n\n", // 構造体配列への読み出し stars[i].tm_year,stars[i].tm_mon,stars[i].tm_mday,stars[i].tm_hour, stars[i].tm_min,stars[i].tm_sec,stars[i].score); } fflush(stdout); fclose(fp); printf("count1は%d\n\n", *count); return *count; } int main(void) { int count=0; int retry; double score; // 今回の所要時間 double bestscore; double* p; double* q; get_data2(&count); kako_rireki(&count,p,q); printf("count3:%d\n", count); return (0); } /* 実行結果 C:\MinGW\users\chap09\kadai>gcc -I. -o kadai9-1c kadai9-1c.c pdcurses.a C:\MinGW\users\chap09\kadai> kadai9-1c count01:29 前回の終了は2017年 10月 2日 17時 59分 31秒 で 前回までの最高得点(最短所要時間)は2017年9月14日10時21分18秒で これまでの最高得点(最短所要時間)は6.0秒です。 count0:29 ■過去の履歴は................ 2015年 12月 7日 19時 9分 59秒 所要時間(score)は8.0 2016年 1月 4日 1時 9分 11秒 所要時間(score)は7.5 以下省略 C:\MinGW\users\chap09\kadai> */
構造体配列と記載の部分を必要に応じて動的に拡張したいという意図でしょうか? その通りであれば、「リスト構造」というキーワードを調べてみるとよろしいかと思います。
ありがとうございます。TIME_DATA stars[MAXCNT]のところで、MAXCNTを100に設定しています。これをmallocを使って、コードを書き直せますか。 &stars[i].tm_hour, &stars[i].tm_min,&stars[i].tm_sec,&stars[i].score)!=7) break;を使えば使う必要はないですか。ここではmllocは使う意味がないですか?
回答2件
あなたの回答
tips
プレビュー