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

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

構造体自体をポインターに入れたい

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

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

  • ベストアンサー
  • 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

  • 構造体をポインターに入れたい

    構造体をポインターに入れたいのですがうまくいきません どうしたら入れることができますか? ―――ソース――― struct str{  char *name; }; static struct str state_ab[60][4] = {   { { { "いちご" } } , { { "みかん" } } ,{ { "レモン" } } , { { "ブドウ" } } },   { { { "" } } , { { "" } } ,{ { "" } } , { { "" } } }, }; static struct str state_ab2[60][8] = {   { { { "きゅうり" } } , { { "セロリ" } } ,{ { "じゃがいも" } } , { { "にんじん" } } , { { "たまねぎ" } } , { { "ニンニク" } } ,{ { "レタス" } } , { { "キャベツ" } } },   { { { "" } } , { { "" } } ,{ { "" } } , { { "" } } , { { "" } } , { { "" } } ,{ { "" } } , { { "" } } }, }; static struct str state_ab3[60][4] = {   { { { "牛肉" } } , { { "豚肉" } } ,{ { "鶏肉" } } , { { "魚肉" } } },   { { { "" } } , { { "" } } ,{ { "" } } , { { "" } } }, }; char *state_ab_f_read( int mode , int num1 , int num2 ){   struct str *p;   switch( mode ){     case 0: p = state_ab; break;     case 1: p = state_ab2; break;     case 2: p = state_ab3; break;   }   return p[ num1 ][ num2 ].name; } ―――エラー内容――― c:\documents and settings\user\my documents\visual studio 2008\projects\kami\state_ab_fd.cpp(237) : error C2440: '=' : 'str [60][4]' から 'str *' に変換できません。 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 c:\documents and settings\user\my documents\visual studio 2008\projects\kami\state_ab_fd.cpp(238) : error C2440: '=' : 'str [60][8]' から 'str *' に変換できません。 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 c:\documents and settings\user\my documents\visual studio 2008\projects\kami\state_ab_fd.cpp(239) : error C2440: '=' : 'str [60][4]' から 'str *' に変換できません。 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 c:\documents and settings\user\my documents\visual studio 2008\projects\kami\state_ab_fd.cpp(241) : error C2676: 二項演算子 '[' : 'str' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照) c:\documents and settings\user\my documents\visual studio 2008\projects\kami\state_ab_fd.cpp(241) : error C2228: '.name' の左側はクラス、構造体、共用体でなければなりません ビルドログは "file://c:\Documents and Settings\USER\My Documents\Visual Studio 2008\Projects\kami\Debug\BuildLog.htm" に保存されました。

  • c++によるエラー

    ここ(http://japan.maxim-ic.com/products/ibutton/software/1wire/wirekit.cfm)のサイトの、1-Wire Public Domain Kit + examples + all link files + assembly language files これをDLし、その中にあるThermoを実行したいのですが、エラーが出てしまいます。 ソースファイルに Thermodl.c , Thermoms.c ヘッダーファイルに findtype.h , ownet.h , thermo21.h を入れてあります。 これを実行すると、以下のエラーが出てしまいます。 1>c:\documents and settings\administrator\my documents\visual studio 2010\projects\hiraki\hiraki\thermodl.c(11): error C2143: 構文エラー : ')' が '*' の前にありません。 1>c:\documents and settings\administrator\my documents\visual studio 2010\projects\hiraki\hiraki\thermodl.c(11): error C2143: 構文エラー : '{' が '*' の前にありません。 1>c:\documents and settings\administrator\my documents\visual studio 2010\projects\hiraki\hiraki\thermodl.c(11): error C2059: 構文エラー : '型' 1>c:\documents and settings\administrator\my documents\visual studio 2010\projects\hiraki\hiraki\thermodl.c(11): error C2059: 構文エラー : ')' 1>c:\documents and settings\administrator\my documents\visual studio 2010\projects\hiraki\hiraki\thermodl.c(114): warning C4013: 関数 'PrintResults' は定義されていません。int 型の値を返す外部関数と見なします。 1>c:\documents and settings\administrator\my documents\visual studio 2010\projects\hiraki\hiraki\thermodl.c(145): error C2371: 'PrintResults' : 再定義されています。異なる基本型です。 1> 1>ビルドに失敗しました。 visual studio2010の製品版を使っています。どのように修正すればよいでしょうか。 教えてください。

  • VC++ 2008で別classからFormがincludeできません

    お世話になります。 タイトルの通り、別ソースで書いてあるクラスでForm1のincludeができません。includeすれば、そのclassの型が使用できるという認識なのですが、何か他にしなければならない事があるのでしょうか…。 環境はVisual C++ 2008 Express Editionです。 以下、ソースです。 [Form1.h] #pragma once #include "testclass.h" namespace testAppli { (略) private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { testclass *aaa = new testclass(); aaa->testfunc(this); } [testclass.h] #pragma once #include "stdafx.h" #include "Form1.h" class testclass { public: void testfunc(Form1^ aaa); }; [testclass.cpp] #include "stdafx.h" #include "testclass.h" void testclass::testfunc(Form1^ aaa) { return; } 以下のコンパイルエラーが出ています。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(98) : error C2065: 'testclass' : 定義されていない識別子です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(98) : error C2065: 'aaa' : 定義されていない識別子です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(98) : error C2061: 構文エラー : 識別子 'testclass' 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(99) : error C2065: 'aaa' : 定義されていない識別子です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(99) : error C2227: '->testfunc' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 1> 型は ''unknown-type'' です。 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\testclass.h(8) : error C2061: 構文エラー : 識別子 'Form1' 1>.\testclass.cpp(4) : error C2065: 'Form1' : 定義されていない識別子です。 1>.\testclass.cpp(4) : error C2065: 'aaa' : 定義されていない識別子です。 1>.\testclass.cpp(5) : error C2448: 'testclass::testfunc' : 関数の定義が間違っています。 1>testAppli.cpp 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\testclass.h(8) : error C2061: 構文エラー : 識別子 'Form1' 1>c:\documents and settings\in flames\my documents\visual studio 2008\projects\testappli\testappli\Form1.h(99) : error C2660: 'testclass::testfunc' : 関数に 1 個の引数を指定できません。

  • Visial C++におけるプログラミング

    Visial C++ 2008を使用したプログラミングについてです。 学校の課題をやるためやむなくVisial C++2008を使用していて 学校では実行が出来たのに家では出来ませんでした。 ソースファイルは以下のとおりです。 #include <stdio.h> #include <stdlib.h> #include <time.h> /*構造体宣言*/ struct Students{ int N; int A; int B; int C; }; int main(void){ struct Students std[50]; /*構造体型配列*/ int i,N,A,B,C,num,scannum; srand((unsigned)time(NULL)); /*乱数の初期化*/ FILE *file; /*ファイルのポインタを用意*/ file=fopen("Data.txt","r"); /*Dataファイルの読み込み*/ /*ファイルのオープンチェック*/ if(file==NULL){ fprintf(stderr,"cannnot open file 'Data.txt'\n"); exit(1); } /*Studentsにデータを格納*/ for(i=0;i<=49;i++){ fscanf(file,"%d%d%d",&N,&A,&B); std[i].N=N; std[i].A=A; std[i].B=B; std[i].C=70+(rand()/(RAND_MAX+1.0)*31); /*表示*/ printf("学籍番号:%d.",std[i].N); printf("科目A:%d.\n",std[i].A); printf("科目B:%d.\n",std[i].B); printf("科目C:%d.\n",std[i].C); } fclose(file); return 0; } エラーとしては 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(21) : error C2275: 'FILE' : この型は演算子として使用できません 1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(69) : 'FILE' の宣言を確認してください。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(21) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(23) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(23) : warning C4047: '=' : 間接参照のレベルが 'int' と 'FILE *' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(26) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(26) : warning C4047: '==' : 間接参照のレベルが 'int' と 'void *' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(32) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(32) : warning C4047: '関数' : 間接参照のレベルが 'FILE *' と 'int' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(32) : warning C4024: 'fscanf' : の型が 1 の仮引数および実引数と異なります。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(36) : warning C4244: '=' : 'double' から 'int' への変換です。データが失われる可能性があります。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(45) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(45) : warning C4047: '関数' : 間接参照のレベルが 'FILE *' と 'int' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(45) : warning C4024: 'fclose' : の型が 1 の仮引数および実引数と異なります。 1>ビルドログは "file://c:\Documents and Settings\devil\My Documents\Visual Studio 2008\Projects\テスト\テスト\Debug\BuildLog.htm" に保存されました。 と表示されます。FILEの宣言をしているのになんで確認してください と出るのでしょうか。。。。解決にご協力お願いします。m(__)m

  • 本に従ってビルドを進めていったつもりが・・失敗;

    ------ ビルド開始: プロジェクト: D3DFWsamplw, 構成: Debug Win32 ------ コンパイルしています... Renderer.cpp c:\dx90sdk\include\d3d9.h(33) : fatal error C1083: include ファイルを開けません。'objbase.h': No such file or directory Scene.cpp c:\documents and settings\owner\my documents\visual studio 2005\projects\d3dfwsamplw\d3dfwsamplw\scene.cpp(6) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory Window.cpp c:\documents and settings\owner\my documents\visual studio 2005\projects\d3dfwsamplw\d3dfwsamplw\window.cpp(8) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory コードを生成中... ビルドログは "file://c:\Documents and Settings\Owner\My Documents\Visual Studio 2005\Projects\D3DFWsamplw\D3DFWsamplw\Debug\BuildLog.htm" に保存されました。 D3DFWsamplw - エラー 3、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ========== とでてしまいます、これだけみてなにが悪いのか誰か説明できるひといませんか?初心者なんですいません;

  • このエラーの対処法を教えて下さい。

    Visual C++ 2005 Express Edition で、DXライブラリを使ったプログラムをコンパイルすると、 「kamakiri1.cpp(206) : fatal error C1075: 左側 中かっこ '{' に対応するものが 'c:\documents and settings\□\my documents\visual studio 2005\projects\newgame\kamakiri1.cpp(21)' で見つかる前に EOF が検出されました。」と出たのですが、これはどういうエラーなんでしょうか。

  • visual C++ ビルド

    visual C++ ビルド 次のソースをビルドしたら、こんなエラーがでてきました。 どこがだめなんでしょうか。 //画面への出力を行うプログラム #include <instream> using namespace std; int main() { cout << "初めてのC++プログラム。\n"; cout << "画面に出力しています。\n"; } ビルド結果 1>------ ビルド開始: プロジェクト: hello, 構成: Debug Win32 ------ 1>コンパイルしています... 1>list1-1.cpp 1>c:\documents and settings\藤本剛史\my documents\visual studio 2008\projects\hello\list1-1.cpp(3) : fatal error C1083: include ファイルを開けません。'instream': No such file or directory 1>ビルドログは "file://c:\Documents and Settings\藤本剛史\My Documents\Visual Studio 2008\Projects\hello\Debug\BuildLog.htm" に保存されました。 1>hello - エラー 1、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

  • Visual C++のサンプルプログラムを入力時

    Visual C++のサンプルプログラム(CD付属ソースから)を入力・コンパイル時のエラー すみません、教えてgoo初心者なもので、返信感覚で回答者にお礼を書いていたら再質問の順序等訳がわからなくなってしまったので新規に質問します。 前回質問:http://okwave.jp/qa/q6315455.html 猫でもわかるゲームプログラミングhttp://www.kumei.ne.jp/c_lang/index.htmlという本で勉強しようとしています。 本の巻末に書いてある通り、プロジェクトを新規作成でWindowsアプリケーション、空のプロジェクトで始め、サンプルのソースをコピー&ペーストで貼り付けたんですが、 1>new1.cpp 1>c:\documents and settings\REI\my documents\visual studio 2008\projects\new1\new1\new1.cpp(58) : error C2440: '=' : 'LPCSTR' から 'LPCWSTR' に変換できません。 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>c:\documents and settings\REI\my documents\visual studio 2008\projects\new1\new1\new1.cpp(85) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 1>ビルドログは "file://c:\Documents and Settings\REI\My Documents\Visual Studio 2008\Projects\new1\new1\Debug\BuildLog.htm" に保存されました。 1>new1 - エラー 2、警告 0 となります。すみません、ソースは文字数の関係でUPできないのですが、 これでは苦労してプログラム入力したとしても悉く実行できないってことですよね。 どなたか分かる方いましたらご回答ください。

  • エラーがでるようになりました。

    vs2005を使っているんですが、 「c:\documents and settings\rm\my documents\visual studio 2005\projects\o.c\o.c.cpp(17) : fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?」 というわけの分からない表示が出ました。 どのプログラムも実行できず、この表示が出ます。 急にそうなったんですが、特別なことをした覚えはありません。

  • VC++2010で配列を使用する方法

    String ^test[10]; とすると 1>d:\documents and settings\my documents\visual studio 2010\projects\Form1.h(233): error C2728: 'System::String ^' : ネイティブ配列はこのマネージ型を含むことはできません とエラーが出ます どのようにすれば良いのでしょうか?

専門家に質問してみよう