誕生日にもらった意外なもの

構造体自体をポインターに入れて、ポーンターから位置をずらして表示したいものを表示したいのですが、どのようにすればよろしいでしょうか?
現在下記のように書いていますがコンパイルエラーになります

static struct{
 char *name; //名前
 int num; //数
}eat1[5] = {
 { "もも" , 1 },
 { "みかん" , 2 },
};

static struct{
 char *name; //名前
 int num; //数
}eat2[5] = {
 { "きゅうり" , 1 },
 { "ナス" , 2 },
};

 int *p;
 int mode = 2;
 int i;

 switch( mode ){
  case 1: p = &eat1;
  case 2: p = &eat2;
 }

 for( i = 0; i < 5; i++; ){
  printf( "%d\n" , p[i].num );
 }

エラー内容
c:\documents and settings\user\my documents\visual studio 2008\projects\kami\bese_item_cd.cpp(303) : error C2440: '=' : '<unnamed-type-eat1> (*)[5]' から 'int *' に変換できません。
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\documents and settings\user\my documents\visual studio 2008\projects\kami\bese_item_cd.cpp(304) : error C2440: '=' : '<unnamed-type-eat2> (*)[5]' から 'int *' に変換できません。
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\documents and settings\user\my documents\visual studio 2008\projects\kami\bese_item_cd.cpp(307) : error C2059: 構文エラー : ';'
c:\documents and settings\user\my documents\visual studio 2008\projects\kami\bese_item_cd.cpp(308) : error C2228: '.num' の左側はクラス、構造体、共用体でなければなりません
型は 'int' です。

A 回答 (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}},
};

intmain (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 );
}
}
}
    • good
    • 0
この回答へのお礼

再び回答ありがとうございます。
質問に添った形での回答ありがとうございます。
無事にプログラムがコンパイルできました。


べストアンサーの方については迷ったのですが一次配列と2次配列のポインターの入れ方を教えていたhashioogiさんにさせていただきます。

皆様ありがとうございました。

お礼日時:2014/04/28 17:57

2次元配列を使うとすれば、以下のような感じでしょうか。


http://pastebin.com/D7XVTMhw
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/04/28 17:52

構造体に名前がついてないから参照のしようがない。



typedef stract 構造体名_s {
 char *name; //名前
 int num; //数
} 構造体名_t ;

static 構造体名_t eat1[5] = {
 { "もも" , 1 },
 { "みかん" , 2 },
};

static 構造体名_t eat2[5] = {
 { "きゅうり" , 1 },
 { "ナス" , 2 },
};

構造体名_t *p;

にすれば良いと思うの。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/04/28 17:50

「2次配列」ってなんですか?



具体的にはどう書いてどんなエラーになるんですか?
    • good
    • 0
この回答へのお礼

変身遅くなりました

すみません言い方が悪かったですね
eat1とeat2を一緒にして2次元配列にする方です

エラーは修正したら消えてしまったのでかけなくなりましたすみません

お礼日時:2014/04/28 17:49

#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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/04/27 19:19

お気に召すかどうかわかりませんが…。



struct str {
char *name; //名前
int num; //数
} ;
static struct str eat1[5] = {
{ "もも" , 1 },
{ "みかん" , 2 },
};

static struct str eat2[5] = {
{ "きゅうり" , 1 },
{ "ナス" , 2 },
};

intmain (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 );
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます
1次配列では問題なく動きました。
break; を入れることは忘れていました。

ただ2次配列ではエラーが出ます。
2次配列の場合どのように書くのでしょうか?

お礼日時:2014/04/27 19:16

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