🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3766閲覧

C言語にてコンパイルエラーが出ました。データの平均値を出したいです

ooooo11

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/01/19 03:35

編集2021/01/19 04:40

前提・実現したいこと

subscripted value is neither array nor pointer nor vector
と言うエラーが出てしまいました。
検索してみたのですがいまいち何が問題なのかもわからない状態です。
やりたいこととしましては、年齢と身長、体重それぞれの平均値を表示することです。
コンパイル後実行すると、操作メニューにいき、1~4までの数字を入力すると、
データを読み込んだり表示したりでき、2の全表示をすると、平均値を算出できると言うものです。

発生している問題・エラーメッセージ

subscripted value is neither array nor pointer nor vector

該当のソースコード

C言語

1#include <stdio.h> 2#define STUD 100 3#define CORS 3 4typedef struct Body 5{ 6 char name[32]; 7 int age; 8 double height; 9 double weight; 10}Body; 11//構造体定義の宣言 12//参考:【B4】おまけ課題 3~9行目 13int print_bodydata(const Body* pData); 14int input_bodydata(Body* pData); 15FILE* open_file(char mode[]); 16//関数のプロトタイプ宣言 17int main(void) 18{ 19 int i,rc=0,cnt=0; 20 Body Data[100]; 21 FILE* fp; 22 //変数の宣言 23 int menu; 24 int Sum_a[STUD]={0}; 25 26 while(1){ 27 printf("\n=== 操作メニュー ===\n"); 28 printf("1:ファイル読み込み\n"); 29 printf("2:全データ表示\n"); 30 printf("3:新データ入力\n"); 31 printf("4:ファイル書き出し\n"); 32 printf("1~4以外:終了\n\n"); 33 34 printf("操作No の入力:"); 35 scanf("%d",&menu); printf("\n"); 36 switch(menu){ 37 case 1: 38 printf("\n=== ファイル読み込み ===\n"); 39 fp=open_file("r"); if(fp==NULL) return -1; 40 for(i=0;i<100;i++){ 41 rc=fscanf(fp,"%s\t%d\t%lf\t%lf\r\n", 42 Data[i].name, &Data[i].age, 43 &Data[i].height, &Data[i].weight); 44 if(rc==EOF) break; 45 } 46 cnt=i; 47 printf("%d件のデータをファイルから読み込みました\n",cnt); 48 fclose(fp); 49 //ファイルを開き 構造体配列に読み込む 50 break; 51 case 2: 52 printf("\n=== 全データ表示 ===\n"); 53 printf("\n名前\t年齢\t身長\t 体重\n"); 54 for(i=0;i<cnt;i++) print_bodydata(&Data[i]); 55 //構造体配列の内容を一件1行として画面に表示 56 //データ件数と、それぞれの項目についての前件の平均値を表示 57 printf("%d件のデータをファイルから読み込みました\n",cnt); 58 for(i=0;i<100;i++){ 59 rc=fscanf(fp,"%s\t%d\t%lf\t%lf\r\n", 60 Data[i].name, &Data[i].age, 61 &Data[i].height, &Data[i].weight); 62 } 63 for(rc=0;rc<CORS;rc++) { 64 Sum_a[rc] = Sum_a[rc] + Data[rc].age; 65 } 66 cnt=i; 67 printf("\n【平均年齢】\n"); 68 printf("%.1f才\t", (float)Sum_a[rc]/cnt); 69 break; 70 case 3: 71 printf("\n=== 新データ入力 ===\n"); 72 if(cnt==100){ 73 printf("最大件数のため、データ入力できません\n\n"); 74 return -1; 75 } 76 input_bodydata(&Data[cnt]); 77 print_bodydata(&Data[cnt]); 78 cnt++; 79 //構造体配列に新データを追加する 80 break; 81 case 4: 82 printf("\n=== ファイル書き出し ===\n"); 83 fp=open_file("w"); if(fp==NULL) return -1; 84 for(i=0;i<cnt;i++){ 85 fprintf(fp,"%s\t%d\t%f\t%f\r\n", 86 Data[i].name, Data[i].age, 87 Data[i].height, Data[i].weight); 88 } 89 printf("%d件のデータをファイルへ書き出しました\n", cnt); 90 fclose(fp); 91 //printf("ファイルを閉じました\n"); 92 //構造体配列の内容をファイルに書き出す 93 break; 94 default: 95 //プログラム終了 96 return 0; 97 } 98 } 99 return 0; 100} 101FILE* open_file(char mode[]) 102 { 103 FILE* fp; 104 char filename[32]; 105 106 printf("\nファイル名を指定:"); scanf("%s",filename); 107 fp=fopen(filename, mode); 108 if(fp==NULL){ 109 printf("ファイルを開けませんでした\n"); 110 return NULL; 111 } 112 //printf("ファイルを開きました\n"); 113 return fp; 114} 115 116int print_bodydata(const Body* pData) 117{ 118 printf("%s\t", pData->name); 119 printf("%d才\t", pData->age); 120 printf("%.1fcm\t", pData->height); 121 printf("%7.1fkg\n", pData->weight); 122 return 0; 123} 124 125int input_bodydata(Body* pData) 126{ 127 printf("名前:"); scanf("%s", pData->name); 128 printf("年齢:"); scanf("%d", &pData->age); 129 printf("身長:"); scanf("%lf", &pData->height); 130 printf("体重:"); scanf("%lf", &pData->weight); 131 printf("\n"); 132 return 0; 133}

試したこと

エラー文を検索し、意味を調べてみたのですが該当部分としましては、71行目
Sum_a[rc] = Sum_a[rc] + Data[cnt][rc];
の部分ででているため、そこをみてみたのですがどこが配列でもポインタでもないといわれているのかわからない状態です。
初心者のため記述が変なところなどあるかと思いますが、ご指摘よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

深津 旭弘 29 183 78
深津 英臣 27 180 70
藤井 直伸 25 183 78
関田 誠大 23 177 70
米山 裕太 32 185 85
鈴木 悠二 35 190 80
清水 邦広 30 193 94
高松 卓矢 29 186 82
栗山 雅史 28 190 85
柳田 将洋 24 186 79
山田 脩造 24 193 78
高野 直哉 24 190 77
小川 猛 22 193 90
久原 翼 22 189 79
石川 祐希 21 192 84
鈴木 祐貴 20 201 85
新井 雄大 19 188 86
富松 崇彰 32 192 85
李  博 26 194 83
傳田 亮太 25 191 84
出耒田 敬 25 200 92
山内 晶大 23 204 72
高橋健太郎 22 202 100
大竹 壱青 21 201 100
小野寺太志 21 201 98
古賀太一郎 27 170 70
浅野 博亮 26 178 69
鶴田 大樹 25 177 76
井手 智 25 174 74
冨永こよみ 28 176 67
佐藤 美弥 27 174 61
田中 美咲 25 173 61
宮下 遥 22 177 61
石井 里沙 27 179 65
新鍋 理沙 26 173 64
長岡 望悠 25 179 64
石井 優希 26 180 68
野本 梨佳 25 180 73
内瀬戸真実 25 171 70
堀川 真理 25 183 70
高橋 沙織 24 177 67
鍋谷友理枝 23 176 57
井上愛里沙 22 178 66
田中 瑞稀 21 170 73
古賀紗理那 21 180 66
黒後 愛 19 180 69
荒木絵里香 32 186 78
松本亜弥華 28 188 71
岩坂 名奈 26 187 76
奥村 麻依 26 177 66
島村 春世 25 182 77
大野 果奈 25 180 70
井上 琴絵 27 162 53
佐藤あり紗 27 166 53
小幡 真子 24 164 55
深津 旭弘 29 183 78
深津 英臣 27 180 70
藤井 直伸 25 183 78
関田 誠大 23 177 70
米山 裕太 32 185 85
鈴木 悠二 35 190 80
清水 邦広 30 193 94
高松 卓矢 29 186 82
栗山 雅史 28 190 85
柳田 将洋 24 186 79
山田 脩造 24 193 78
高野 直哉 24 190 77
小川 猛 22 193 90
久原 翼 22 189 79
石川 祐希 21 192 84
鈴木 祐貴 20 201 85
新井 雄大 19 188 86
富松 崇彰 32 192 85
李  博 26 194 83
傳田 亮太 25 191 84
出耒田 敬 25 200 92
山内 晶大 23 204 72
高橋健太郎 22 202 100
大竹 壱青 21 201 100
小野寺太志 21 201 98
古賀太一郎 27 170 70
浅野 博亮 26 178 69
鶴田 大樹 25 177 76
井手 智 25 174 74
冨永こよみ 28 176 67
佐藤 美弥 27 174 61
田中 美咲 25 173 61
宮下 遥 22 177 61
石井 里沙 27 179 65
新鍋 理沙 26 173 64
長岡 望悠 25 179 64
石井 優希 26 180 68
野本 梨佳 25 180 73
内瀬戸真実 25 171 70
堀川 真理 25 183 70
高橋 沙織 24 177 67
鍋谷友理枝 23 176 57
井上愛里沙 22 178 66
田中 瑞稀 21 170 73
古賀紗理那 21 180 66
黒後 愛 19 180 69
荒木絵里香 32 186 78
松本亜弥華 28 188 71
岩坂 名奈 26 187 76
奥村 麻依 26 177 66
島村 春世 25 182 77
大野 果奈 25 180 70
井上 琴絵 27 162 53
佐藤あり紗 27 166 53
小幡 真子 24 164 55

上記がデータになります。
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

年齢の平均を出すのなら
Sum_a[rc] = Sum_a[rc] + Data[cnt][rc];を
Sum_a[rc] = Sum_a[rc] + Data[rc].age;
にしてください。
とりあえず、それでコンパイルエラーは取れます。
ほかは見ていません。

まず、テストデータが100件を超えているので

#define STUD 200 Body Data[STUD]; //修正

とします。

平均の部分だけ提示します。

case 2: printf("\n=== 全データ表示 ===\n"); printf("\n名前\t年齢\t身長\t 体重\n"); for(i=0;i<cnt;i++) print_bodydata(&Data[i]); //構造体配列の内容を一件1行として画面に表示 //データ件数と、それぞれの項目についての前件の平均値を表示 printf("%d件のデータをファイルから読み込みました\n",cnt); for(rc=0;rc<cnt;rc++) { //修正 Sum_a[0] = Sum_a[0] + Data[rc].age; //修正 } printf("\n【平均】\n"); printf("%.1f才\t", (float)Sum_a[0]/cnt); //修正 break;

投稿2021/01/19 03:56

編集2021/01/19 04:58
tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ooooo11

2021/01/19 04:23

回答ありがとうございます。 ご指摘の通り、修正しました。 ですが数式に問題があるのか、平均値がうまく算出できません。 printf("%.1f才\t", (float)Sum_a[rc]/cnt);としているのですが、数式に問題はありますでしょうか? 何度も質問すみません。
tatsu99

2021/01/19 04:34

テストしたデータを提示していただけますか。 そのデータを使って、こちらでも試してみます。
ooooo11

2021/01/19 04:41

長いので質問文に提示しております。 よろしくお願いします。 何度もありがとうございます。
fana

2021/01/19 04:45

> printf("%.1f才\t", (float)Sum_a[rc]/cnt);としているのですが、数式に問題はありますでしょうか? 問題あるのかないのか,自分でチェックするという選択肢は無いのですか? この時点での rc, cnt, Sum_a[rc] の値はすべて想定通りになっているのか否か等を実際に自分で確認してみれば良いのでは? 何でも他人にやってもらうのではなく.
tatsu99

2021/01/19 04:58

回答欄に追記しました。
ooooo11

2021/01/19 05:03

ありがとうございました!なんとか解決できました!自分でも色々と触ってみたのですがわからず・・・。 たすかりました。
guest

0

そこをみてみたのですがどこが配列でもポインタでもないといわれているのかわからない状態です。

Data[cnt]Body型ですので、さらに[rc]を付けても意味が通りません。

投稿2021/01/19 03:38

編集2021/01/19 03:39
maisumakun

総合スコア145970

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/01/19 03:40

あと、「int Sum_a[1]」なのにfor(rc=0;rc<CORS;rc++)で増やしながらSum_a[rc]に書き込んでいますが、このようなことをした場合、何が起きるか保証されません。
fana

2021/01/19 04:17

> Body Data[2]; こっちの個数もやばそうですね.
ooooo11

2021/01/19 04:18

回答ありがとうございます。 修正しました。 エラーは解消したのですが、平均値がうまく算出できないようで、 計算式は、printf("%.1f才\t", (float)Sum_a[rc]/cnt);としているのですが、全体の合計が出てしまっていて、うまく平均が出せていません。 この計算式が悪いのでしょうか?それとも他の部分で不完全な箇所があるということでしょうか。 何度も申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問