• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体自体をポインターに入れたい)

構造体をポインタに入れて位置をずらして表示する方法

このQ&Aのポイント
  • 構造体自体をポインタに入れて、要素を位置をずらして表示する方法について教えてください。
  • 現在、構造体をポインタに入れるためのコードを書いていますが、コンパイルエラーが発生しています。
  • エラーメッセージによれば、構造体とポインタの型が関連していないということのようです。どのように修正すればよいでしょうか?

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

  • ベストアンサー
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.6

2次元配列を使うと言ってもあなたがどういうものを想定しているのかよくわからないのだけれども…。 (1) eat1とeat2を一緒にして2次元配列にするならNo.5の方の書き方になるし、 (2) eat1とeat2がそれぞれ別々の2次元配列になるならポインタの書き方を工夫する必要がある。 struct str { char *name; //名前 int num; //数 } ; static struct str eat1[2][3] = { {{ "もも" , 1 }, { "みかん" , 2 }, {"ブドウ", 3}}, {{ "キウイ" , 4 }, { "パイン" , 5 }, {"カキ", 6}} }; static struct str eat2[2][3] = { {{ "きゅうり" , 1 }, { "ナス" , 2 }, {"カボチャ", 3}}, {{ "キャベツ" , 4 }, { "大根" , 5 }, {"ネギ", 6}}, }; int main (void) { struct str (*p) [3] ; int mode = 2; int i,j; switch( mode ){ case 1: p = eat1; break ; case 2: p = eat2; break ; } for( i = 0; i < 2; i++) { for( j = 0; j < 3; j++) { printf( "%d\n" , p[i][j].num ); } } }

mana5867
質問者

お礼

再び回答ありがとうございます。 質問に添った形での回答ありがとうございます。 無事にプログラムがコンパイルできました。 べストアンサーの方については迷ったのですが一次配列と2次配列のポインターの入れ方を教えていたhashioogiさんにさせていただきます。 皆様ありがとうございました。

その他の回答 (5)

回答No.5

2次元配列を使うとすれば、以下のような感じでしょうか。 http://pastebin.com/D7XVTMhw

mana5867
質問者

お礼

はいこちらの方法です。 教えてくださりありがとうございました

  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.4

構造体に名前がついてないから参照のしようがない。 typedef stract 構造体名_s {  char *name; //名前  int num; //数 } 構造体名_t ; static 構造体名_t eat1[5] = {  { "もも" , 1 },  { "みかん" , 2 }, }; static 構造体名_t eat2[5] = {  { "きゅうり" , 1 },  { "ナス" , 2 }, }; 構造体名_t *p; にすれば良いと思うの。

mana5867
質問者

お礼

構造体の基本的な書き方ですね 教えてくださりありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「2次配列」ってなんですか? 具体的にはどう書いてどんなエラーになるんですか?

mana5867
質問者

お礼

変身遅くなりました すみません言い方が悪かったですね eat1とeat2を一緒にして2次元配列にする方です エラーは修正したら消えてしまったのでかけなくなりましたすみません

回答No.2

#include <stdio.h> typedef struct { char *name; //名前 int num; //数 } record; static record eat1[5] = { { "もも" , 1 }, { "みかん" , 2 }, }; static record eat2[5] = { { "きゅうり" , 1 }, { "ナス" , 2 }, }; int main() { record* p; int mode = 2; int i; switch( mode ){ case 1: p = &eat1; break; case 2: p = &eat2; break; } for( i = 0; i < 5; i++ ){ printf( "%d\n" , p[i].num ); } return 0; }

mana5867
質問者

お礼

1さんとは違う書き方ですね typdef を使った書き方を教えてくださりありがとうございます。

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.1

お気に召すかどうかわかりませんが…。 struct str { char *name; //名前 int num; //数 } ; static struct str eat1[5] = { { "もも" , 1 }, { "みかん" , 2 }, }; static struct str eat2[5] = { { "きゅうり" , 1 }, { "ナス" , 2 }, }; int main (void) { struct str *p; int mode = 2; int i; switch( mode ){ case 1: p = eat1; /* breakが必要 */break ; case 2: p = eat2; break ; } for( i = 0; i < 5; i++) { printf( "%d\n" , p[i].num ); } }

mana5867
質問者

お礼

ありがとうございます 1次配列では問題なく動きました。 break; を入れることは忘れていました。 ただ2次配列ではエラーが出ます。 2次配列の場合どのように書くのでしょうか?

関連するQ&A