アプリ版:「スタンプのみでお礼する」機能のリリースについて

subscripted value is neither array nor pointer nor vector
と言うエラーが出てしまいました。

ソースコードは下記の通りです。
#include <stdio.h>
#define STUD 100
#define CORS 3

typedef struct Body
{
char name[32];
int age;
double height;
double weight;
}Body;
//構造体定義の宣言
//参考:【B4】おまけ課題 3~9行目
int print_bodydata(const Body* pData);
int input_bodydata(Body* pData);
FILE* open_file(char mode[]);
//関数のプロトタイプ宣言
//参考:【B4】おまけ課題 11~13行目

int main(void)
{
int i,rc=0,cnt=0;
Body Data[2];
FILE* fp;
//変数の宣言
//参考:【B4】おまけ課題 17~19行目
int menu;
int Sum_a[1]={0};

while(1){
printf("\n=== 操作メニュー ===\n");
printf("1:ファイル読み込み\n");
printf("2:全データ表示\n");
printf("3:新データ入力\n");
printf("4:ファイル書き出し\n");
printf("1~4以外:終了\n\n");

printf("操作No の入力:");
scanf("%d",&menu); printf("\n");
switch(menu){
case 1:
printf("\n=== ファイル読み込み ===\n");
fp=open_file("r"); if(fp==NULL) return -1;
for(i=0;i<100;i++){
rc=fscanf(fp,"%s\t%d\t%lf\t%lf\r\n",
Data[i].name, &Data[i].age,
&Data[i].height, &Data[i].weight);
if(rc==EOF) break;
}
cnt=i;
printf("%d件のデータをファイルから読み込みました\n",cnt);
fclose(fp);
//ファイルを開き 構造体配列に読み込む
//参考:【B4】おまけ課題 22~32行目
break;
case 2:
printf("\n=== 全データ表示 ===\n");
printf("\n名前\t年齢\t身長\t 体重\n");
for(i=0;i<cnt;i++) print_bodydata(&Data[i]);
//構造体配列の内容を一件1行として画面に表示
//データ件数と、それぞれの項目についての前件の平均値を表示
//参考:【B4】おまけ課題 34~36行目
printf("%d件のデータをファイルから読み込みました\n",cnt);
for(rc=0;rc<CORS;rc++) {
Sum_a[rc] = Sum_a[rc] + Data[cnt][rc];
}
printf("\n【平均】\n");
printf("%.1f才\t", (float)Sum_a[rc]/STUD);
break;
case 3:
printf("\n=== 新データ入力 ===\n");
if(cnt==100){
printf("最大件数のため、データ入力できません\n\n");
return -1;
}
input_bodydata(&Data[cnt]);
print_bodydata(&Data[cnt]);
cnt++;
//構造体配列に新データを追加する
//参考:【B4】おまけ課題 38~46行目
break;
case 4:
printf("\n=== ファイル書き出し ===\n");
fp=open_file("w"); if(fp==NULL) return -1;
for(i=0;i<cnt;i++){
fprintf(fp,"%s\t%d\t%f\t%f\r\n",
Data[i].name, Data[i].age,
Data[i].height, Data[i].weight);
}
printf("%d件のデータをファイルへ書き出しました\n", cnt);
fclose(fp);
//printf("ファイルを閉じました\n");
//構造体配列の内容をファイルに書き出す
//参考:【B4】おまけ課題 48~56行目
break;
default:
//プログラム終了
return 0;
}
}
return 0;
}
FILE* open_file(char mode[])
{
FILE* fp;
char filename[32];

printf("\nファイル名を指定:"); scanf("%s",filename);
fp=fopen(filename, mode);
if(fp==NULL){
printf("ファイルを開けませんでした\n");
return NULL;
}
//printf("ファイルを開きました\n");
return fp;
}

int print_bodydata(const Body* pData)
{
printf("%s\t", pData->name);
printf("%d才\t", pData->age);
printf("%.1fcm\t", pData->height);
printf("%7.1fkg\n", pData->weight);
return 0;
}

int input_bodydata(Body* pData)
{
printf("名前:"); scanf("%s", pData->name);
printf("年齢:"); scanf("%d", &pData->age);
printf("身長:"); scanf("%lf", &pData->height);
printf("体重:"); scanf("%lf", &pData->weight);
printf("\n");
return 0;
}

エラー文は Sum_a[rc] = Sum_a[rc] + Data[cnt][rc];
のところで出てしまっています。
ご指摘お願いします。

A 回答 (2件)

Data[cnt]


はBody型なのでで、更に[添え字] を付けられない。
    • good
    • 0

プログラムの中身は全く読んでおりませんが、ご質問者様がご指摘の...



Sum_a[rc] = Sum_a[rc] + Data[cnt][rc];

行だけで次の2点に気づきました。

1. int Sum_a[1]={0};
行は『int型の配列Sum_aを1個宣言する。』です。つまり配列Sum_aの添字は"0"しか取り得ないことになります。
ところが、ご指摘の行では、変数rcは0から3まで変化することになっており、明らかなバッファーオーバーフローを起こします。

2. 構造体Bodyの配列Dataは...
Body Data[2];
と宣言されており、つまり一次元配列です。
ところが、ご指摘の行では2次元配列として使用しています。このことがエラーメッセージの原因に思えます。

さらに"Data[cnt][rc]"はBody型であるのに、これと演算しようとしているSum_a[rc]はint型です。これではデータの型が合わないため別のエラーが発生するでしょう。構造体Bodyが持つメンバでint型なのはageであることにご注意下さい、あるいは他のfloat型メンバをキャストして使用するのか、です。

複数宣言しているデータの型と個数をもう一度再確認するべきでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!