- ベストアンサー
構造体をポインタに入れて位置をずらして表示する方法
- 構造体自体をポインタに入れて、要素を位置をずらして表示する方法について教えてください。
- 現在、構造体をポインタに入れるためのコードを書いていますが、コンパイルエラーが発生しています。
- エラーメッセージによれば、構造体とポインタの型が関連していないということのようです。どのように修正すればよいでしょうか?
- みんなの回答 (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 ); } } }
その他の回答 (5)
- MillenniuM
- ベストアンサー率58% (42/72)
2次元配列を使うとすれば、以下のような感じでしょうか。 http://pastebin.com/D7XVTMhw
お礼
はいこちらの方法です。 教えてくださりありがとうございました
- BuriBuri4
- ベストアンサー率28% (150/525)
構造体に名前がついてないから参照のしようがない。 typedef stract 構造体名_s { char *name; //名前 int num; //数 } 構造体名_t ; static 構造体名_t eat1[5] = { { "もも" , 1 }, { "みかん" , 2 }, }; static 構造体名_t eat2[5] = { { "きゅうり" , 1 }, { "ナス" , 2 }, }; 構造体名_t *p; にすれば良いと思うの。
お礼
構造体の基本的な書き方ですね 教えてくださりありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「2次配列」ってなんですか? 具体的にはどう書いてどんなエラーになるんですか?
お礼
変身遅くなりました すみません言い方が悪かったですね eat1とeat2を一緒にして2次元配列にする方です エラーは修正したら消えてしまったのでかけなくなりましたすみません
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#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; }
お礼
1さんとは違う書き方ですね typdef を使った書き方を教えてくださりありがとうございます。
- hashioogi
- ベストアンサー率25% (102/404)
お気に召すかどうかわかりませんが…。 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 ); } }
お礼
ありがとうございます 1次配列では問題なく動きました。 break; を入れることは忘れていました。 ただ2次配列ではエラーが出ます。 2次配列の場合どのように書くのでしょうか?
お礼
再び回答ありがとうございます。 質問に添った形での回答ありがとうございます。 無事にプログラムがコンパイルできました。 べストアンサーの方については迷ったのですが一次配列と2次配列のポインターの入れ方を教えていたhashioogiさんにさせていただきます。 皆様ありがとうございました。