C言語の関数の定義について質問します

このQ&Aのポイント
  • C言語の関数の定義について質問します。添字が付けられた値が、配列、ポインタまたはベクトルではないため、エラーが発生しました。
  • プログラムをコンパイルした結果、添字が付けられた値が正しくないことにより、エラーが発生しました。
  • 配列やポインタの添字の使い方に問題があるため、コンパイルエラーが発生しました。
回答を見る
  • ベストアンサー

C言語の関数の定義について質問します

struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int power; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ int HP; /* 体力 */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; main(){ int a[2][3]; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; struct monster monster2[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; inputmonster(a, monster); printf("これからバトルを開始します\n\n"); printf("player1は%sをくりだした。\n", monster[a[0][0]-1].name); printf("player2は%sをくりだした。\n", monster2[a[1][0]-1].name); battle(a); return 0; } void inputmonster(int x[][3], struct monster monster) { int i, s, t, m, n; for(t = 0; t < 2; t++){ s = 0; while (s < 1){ printf("player%dは好きなモンスターを3つ選んでください\n\n", t+1); for (i = 0; i<3; i++){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); scanf("%d", &x[t][i]); printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &n); if(n == 1) s = 1; else s = 0; } } } 上記のようにプログラムをコンパイルしたところ、 monsterbattle.c: 関数 ‘inputmonster’ 内: monsterbattle.c:497:63: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); ^ monsterbattle.c:499:45: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); ^ monsterbattle.c:503:68: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].na me); というような結果が返ってきました。 どうやら定義がうまくなっていないようなのですが、どこを改善すればうまく動くようになるのでしょうか? お手数ですが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

monster.name[m] monster.name[x[t][i]-1] monster.name[x[t][i]-1] とすれば通りますね。

関連するQ&A

  • C言語について プログラムが動きません

    ゲームのプログラムを作りたいものです。 今、試作の途中の段階で以下のようなプログラムを作ってみたのですが、 コアダンプが表示されてうまく起動しません。 どの点を変更すればいいのか、教えてください。 使っている言語はC言語です。 よろしくお願いいたします。 #include <stdio.h> #include <string.h> struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int attack; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; char names[5][10] = {"v", "w", "x", "y", "z"}; main(){ int s = 0; int a[3]; int i; int m; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60}, }; printf("好きなモンスターを3つ選んでください\n\n"); while (s < 1){ for (i = 0; i++; i<3){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m++; m < 4) printf("%d, %s\n", m+1, monster[m].name); printf("5, %s\n\n", monster[4].name); scanf("%d", a[i]); printf("%d体目 : %s\n\n", i+1, monster[a[i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i++; i<2) printf("%d体目 : %s ", i+1, monster[a[i]-1].name); printf("3体目 : %s\n\n", monster[a[2]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &i); if(i=1) return s = 1; else return s = 0; } }

  • コンパイルエラーについて

    次のようなプログラムをうつと以下のようなコンパイルエラーが表示されます。 main(){ int a[2][3]; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; struct monster monster2[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; inputmonster(a, monster); printf("これからバトルを開始します\n\n"); printf("player1は%sをくりだした。\n", monster[a[0][0]-1].name); printf("player2は%sをくりだした。\n", monster2[a[1][0]-1].name); battle(a, monster, monster2); return 0; } void inputmonster(int x[][3], struct monster monster[]) { int i, s, t, m, n; for(t = 0; t < 2; t++){ s = 0; while (s < 1){ printf("player%dは好きなモンスターを3つ選んでください\n\n", t+1); for (i = 0; i<3; i++){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); scanf("%d", &x[t][i]); printf("%d体目 : %s\n\n", i+1, monster[x[t][i] - 1].name); } printf("これでよろしいですか?\n"); for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i] - 1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &n); if(n == 1) s = 1; else s = 0; } } } monsterbattle.c: 関数 ‘main’ 内: monsterbattle.c:499:15: 警告: 互換性のないポインタ型から 1 番目の ‘inputmonster’ の引数に渡しています inputmonster(&a, monster); ^ monsterbattle.c:27:6: 備考: expected ‘int * (*)[3]’ but argument is of type ‘int (*)[2][3]’ void inputmonster(int *x[][3], struct monster monster[]) ^ monsterbattle.c:507:9: 警告: 互換性のないポインタ型から 1 番目の ‘battle’ の引数に渡しています battle(a, monster, monster2); ^ monsterbattle.c:232:6: 備考: expected ‘int *’ but argument is of type ‘int (*)[3]’ void battle(int a[2], struct monster monster[], struct monster monster2[]) ^ すいませんが、あまりエラーの詳細がわからず困っています。 どこをどのように変更すべき表示なのでしょうか? よえろしくお願いします。

  • C言語 構造体に関するプログラムのエラーについて

    次は自分で書いたプログラムの一部なのですが、このプログラムをコンパイルすると以下のようなエラーが表示されます。 struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int power; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ int HP; /* 体力 */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; struct monster monster2[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, } void battle(int a[2][3], struct monster monster[], struct monster monster2[]) { ・ ・ ・ printf("player2は%sをくりだした。\n", monster2.name[a[1][0] - 1]); ・ ・ printf("%sの残り体力は%d。\n", monster2.name[a[1][0] - 1], monster2.HP[a[1][0] - 1]); } monsterbattle.c:467:61: エラー: 構造体または共用体ではない何かのメンバ ‘name’ の 要求です printf("player2は%sをくりだした。\n", monster2.name[a[1][0] - 1]); ^ monsterbattle.c:475:52: エラー: 構造体または共用体ではない何かのメンバ ‘name’ の 要求です printf("%sの残り体力は%d。\n", monster2.name[a[1][0] - 1], monster2.HP[a[1 ][0] - 1]); ^ monsterbattle.c:475:80: エラー: 構造体または共用体ではない何かのメンバ ‘HP’ の要 求です printf("%sの残り体力は%d。\n", monster2.name[a[1][0] - 1], monster2.HP[a[1 ][0] - 1]); このようなエラーがあちこちで表示されるのですが、どのようにプログラミングを改善すべきなのでしょうか? お手数ですが、よろしくお願いします。

  • C言語の関数を読み込みません。

    今、ゲームのようなプログラムを作っていて、下はそのダメージ計算量を計算するプログラムを書いたつもりでいたのですが、どうやら「compatibility」と作った関数が計算されていないようです。 int compatibility(int a[2][3], int s, int t, struct monster monster[]) { int m; int add; printf("a2\n"); if( (monster[a[s][0]-1].tricktype == 1 && (monster[a[t][0]-1].type == 3 || monster[a[t][0]-1].type == 4)) || (monster[a[s][0]-1].tricktype == 2 && monster[a[t][0]-1].type == 1) || (monster[a[s][0]-1].tricktype == 3 && (monster[a[t][0]-1].type == 2 || monster[a[t][0]-1].type == 4)) || (monster[a[s][0]-1].tricktype == 4 && (monster[a[t][0]-1].type == 2 || monster[a[t][0]-1].type == 5)) || (monster[a[s][0]-1].tricktype == 5 && (monster[a[t][0]-1].type == 1 || monster[a[t][0]-1].type == 3)) /* 効果抜群 */ ){ m = (int)rand() % 2; if(m == 0) add = 1; if(m == 1) add = 2; }else{ if( (monster[a[s][0]-1].tricktype == 1 && (monster[a[t][0]-1].type == 2 || monster[a[t][0]-1].type == 5)) || (monster[a[s][0]-1].tricktype == 2 && monster[a[t][0]-1].type == 3) || (monster[a[s][0]-1].tricktype == 3 && (monster[a[t][0]-1].type == 1 || monster[a[t][0]-1].type == 5)) || (monster[a[s][0]-1].tricktype == 4 && (monster[a[t][0]-1].type == 1 || monster[a[t][0]-1].type == 3)) || (monster[a[s][0]-1].tricktype == 5 && monster[a[t][0]-1].type == 4 ) /* 効果いまひとつ */ ){ m = (int)rand() % 2; if(m == 0) add = 1; if(m == 1) add = 1/2; }else{ m = (int)rand() % 10; if(m == 0){ add = 2; }else{ if(m == 15){ add = 1/2; }else{ add = 1; } } } } return add; } int damage(int i, int a[2][3], struct monster monster[], int b[2]) { int add; double damage; int s, t, u; s = (i+1) % 2; t = i % 2; u = (int)rand() % 32; add = compatibility(a, s, t, monster); ・ ・ ・ } printf("a2\n");を関数内に用いて、実際にcompatibility関数を読み込んでいるのか確かめたのですが、コンパイラーにそう表示されることなく、関数を読み込んでいないのではと判断したしだいです。 長文すいません、お手数ですがどこをどのように変更すればいいのか、教えていただけるとありがたいです。 よろしくお願いします。 ちなみにa[2][3]はint型の配列、monsterはint型のtypeやtrickeffectを収入したもののつもりです。

  • プログラミングの変数について質問です。

    プログラミングの変数について質問です。 次のプログラミングは自分で書いたプログラムの一部です。 void inputmonster(int x[][3], struct monster monster) { int i, s, t, m, n; for(t = 0; t < 2; t++){ s = 0; while (s < 1){ printf("player%dは好きなモンスターを3つ選んでください\n\n", t+1); for (i = 0; i<3; i++){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); scanf("%d", &x[t][i]); printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &n); if(n == 1) s = 1; else s = 0; } } } これをコンパイルすると次のようなエラーが表示されます。 monsterbattle.c: 関数 ‘inputmonster’ 内: monsterbattle.c:497:63: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); ^ monsterbattle.c:499:45: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); ^ monsterbattle.c:503:68: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].na me); どのように改変すればこのようなエラーを表示しないようにできるのでしょうか? 基本的な質問ではあると思いますが、是非教えていただけるとありがたいです。 よろしくお願いします。

  • C言語の質問です。

    C言語の質問です。 C言語で、PCの時間を、キーボードで入力した好きな秒数ごとに表示するプログラムを作りたいのですが、どうしても1秒ごとになってしまいます。ここまで作ったのですが、あとどのようにすればよろしいでしょうか? #include <stdio.h> #include <time.h> #include <string.h> int a2i(char x); main() { time_t jikoku; char t[30]; int h,m,s,so=0; int x,a; printf("秒数xを入力"); scanf("%d",&x); while(1){ for(a=0;a<x;a++){ time(&jikoku); strcpy(t,ctime(&jikoku)); h=a2i(t[11])*10+a2i(t[12]); m=a2i(t[14])*10+a2i(t[15]); s=a2i(t[17])*10+a2i(t[18]); if(s!=so+a){ printf("%d:%d:%d\n",h,m,s); so=s; } } } } int a2i(char x) { return(x-'0'); }

  • プログラミング修正について

    次のようなプログラムをコンパイルしたところ以下のようなエラーが表示されました。 struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int power; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ int HP; /* 体力 */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; main(){ int a[2][3]; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; struct monster monster2[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; inputmonster(a, monster); ・ ・ ・ } void inputmonster(int x[][3], struct monster monster) { } monsterbattle.c:497:2: エラー: 2 番目の ‘inputmonster’ の引数用の互換性がない型です inputmonster(a, monster); ^ monsterbattle.c:27:6: 備考: expected ‘struct monster’ but argument is of type ‘struct monster *’ void inputmonster(int x[][3], struct monster monster) ^ monsterbattle.c:499:2: エラー: プログラム内に逸脱した ‘\357’ があります printf("これからバトルを開始します\n\n"); ^ monsterbattle.c:499:2: エラー: プログラム内に逸脱した ‘\274’ があります monsterbattle.c:499:2: エラー: プログラム内に逸脱した ‘\233’ があります monsterbattle.c:501:2: エラー: expected ‘;’ before ‘printf’ printf("player1は%sをくりだした。\n", monster[a[0][0]-1].name); プログラムを修正したいのですが、正直どこを変えればいいのか全くわかりません。 お手数ですが1つ1つ教えていただけるとありがたいです。 よろしくお願いいたします。

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • C言語で、引数が構造体の場合

    生徒の名前、点数、順位を表示するプログラムをつくりたいのですが、(下のような関数を用いることを前提として) void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } このような場合、関数の引数として、構造体が用いられているわけですよね? 引数が構造体の場合、どのように引数の部分を書けばいいのか分かりません。 私が考えたプログラムは下記の通りです。 もちろんうまくいきませんでした。 たぶん最後のprintfの所のrank1の引数が間違っているだけだと思うんですが、どうでしょうか? include<stdio.h> struct data { char name; int score; int rank; }; void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } void main(void) { int m; static struct data x[] = {{'A',56,1}, {'B',79,1}, {'C',34,1}, {'D',91,1}, {'E',69,1}}; for(m=0;m<5;m++) printf("%c君 %d点 %d位\n",x[m].name,x[m].score,rank1(x,m)); }

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

専門家に質問してみよう