期末試験

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
0137

期末試験

#1

投稿記事 by 0137 » 9年前

至急お願いします。
期末試験の過去問からの質問です。
名前と3科目の点数を読み込むプログラムを作っています。
以下のプログラムでデバッグしたところ、配列またはポインタでない変数に添字が使われましたというエラーが出ます。
これの原因が分かりません。
C言語については基本的なことも理解できてないです。
また、パソコン自体も全く使いこなせません。
そのため、申し訳ありませんが、フォーラムルールを読んでも、codeの使い方が理解できなかったため、そのまま貼り付けさせていただきます。
#include<stdio.h>
#define NUM 6
#define CNUM 20

typedef struct exam {

char name[CNUM];
int score;
int sum;

}exam;

int read(exam data[NUM]) {
FILE *fp;
int i, j;

fp = fopen("test.txt", "r");
if (fp = NULL) {
printf("ファイルをオープンできませんでした\n");
return 1;
}
for (i = 0; i < NUM; i++) {
exam;
data[i].sum = 0;
for (j = 0; j < 3; j++) {
fscanf(fp,"%s",data[i].name[i]);
fscanf(fp,"%d",&data[i].score[i]);

}
}
fclose(fp);
return 0;
}

void sort(exam data[NUM]) {
exam tmp;
int i, j;
for (i = 0; i < NUM - 1; i++) {
for (j = 0; j<NUM - 1;j++) {
if (data[j].score>data[j + 1].score) {
tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
}
}
}


}



int main(void) {

int i;
int res;
exam data[NUM];

res = read(data);
if(res==1)
{
return 1;
}

sort(data);


for (i = 0; i < NUM; i++) {

printf("%d番 : %s %d点\n",i+1,data[i].name,data[i].sum);

}

getchar();
getchar();
return 0;

}

読み取りファイル test.txt
ames 67 87 97
tom 65 54 87
jane 98 67 87
judy 87 65 95
gerorge 76 77 78
emily 78 98 76

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 期末試験

#2

投稿記事 by みけCAT » 9年前

0137 さんが書きました:以下のプログラムでデバッグしたところ、配列またはポインタでない変数に添字が使われましたというエラーが出ます。
そのまんま、配列またはポインタでない変数に添字が使われたからでしょう。

まちがい

コード:

			fscanf(fp,"%s",data[i].name[i]);
			fscanf(fp,"%d",&data[i].score[i]);
改善案

コード:

			fscanf(fp,"%s",data[i].name);
			fscanf(fp,"%d",&data[i].score);
また、これを直しても他にもこのような警告が出て、実行するとSegmentation Faultになりました。
原因はNULLをfscanfの第一引数に渡したことでしょう。

コード:

prog.c: In function 'read':
prog.c:18:2: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  if (fp = NULL) {
  ^
prog.c:23:3: warning: useless type name in empty declaration [enabled by default]
   exam;
   ^
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

0137

Re: 期末試験

#3

投稿記事 by 0137 » 9年前

直してみましたが、次にこのエラーが出ました。
重大度レベル コード 説明 プロジェクト ファイル 行
エラー C4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. rem c:\users\nec-pcuser\documents\visual studio 2015\projects\rem\rem\document.cpp 17
これの原因は何ですか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 期末試験

#4

投稿記事 by みけCAT » 9年前

0137 さんが書きました:直してみましたが、次にこのエラーが出ました。
(略)
これの原因は何ですか?
コンパイラの不都合ですね。
GCC学習用C言語開発環境など、デフォルトでC言語の標準ライブラリに対応しているコンパイラを使用することをおすすめします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
little
記事: 44
登録日時: 13年前
連絡を取る:

Re: 期末試験

#5

投稿記事 by little » 9年前

0137 さんが書きました:これの原因は何ですか?

コード:

この関数や変数が安全でない可能性があります。代わりにfopen_sを使用することを検討してください。
非推奨を無効にするには、_CRT_SECURE_NO_WARNINGSを使用します。
google翻訳より
要訳の通り、fopen_sを使用する又は_CRT_SECURE_NO_WARNINGSを使用することで改善されます。
オフトピック
あれ、この感じ前にも…
百聞は~

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 期末試験

#6

投稿記事 by Dixq (管理人) » 9年前

codeタグの使い方をフォーラムルールを読んでも分からないということはありえないと思います。
よく読んでください。
フォーラムルールに行かなくても投稿する際赤矩形内にやり方が表示されています。

閉鎖

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