• ベストアンサー

配列を含んだ構造体への値設定について教えて下さい。

配列を含んだ構造体への値設定について教えて下さい。 下記のような構造体の定義があります。 typedef struct A_T { UINT64 a1; UINT32 a2; } A_t; typedef struct B_T { UINT32 b1; A_t b[8]; } B_t; 構造体B_tを関数の引数で渡し、A_tのa1とa2に値を設定したいのですが、プログラミング初心者の為、どのように作ればよいのかわかりません。 どうぞ教えて下さい。

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

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

---- 推測による回答:的中率20%位 ----- 構造体のアドレスを渡せば良い。 CなのかC++なのか分からないのでCで書いときます。 呼び出し側  B_t b ;  ~ 略 ~  func(&b) ; 関数側 void func(B_t *b) {  ~ 略 ~ b->b[n].a1 = 1 ; b->b[n].a2 = 2 ;  ~ 略 ~ }

manta-55
質問者

お礼

ご回答ありがとうございます。 うまくいきました。 因みに、C++だとどうなりますか? 勉強の為、教えて頂けないでしょうか?

その他の回答 (3)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

型(UINT64)と変数名(a1)の間に空白がないんですが大丈夫ですか?

manta-55
質問者

お礼

すみません。 ソースコードをコピペした際には空白が入っていたのですが、投稿後は消えていました。。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>構造体B_tを B_t型の変数を定義することはできますか?

manta-55
質問者

お礼

はい、定義できます。

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

「構造体B_tを関数の引数で渡し、A_tのa1とa2に値を設定したい」といわれても, 具体的にどのように設定したいのかわからんとなんともならんのだが....

manta-55
質問者

お礼

すみません。漠然とした内容でした。 No.3さんの回答の予想どおりで、ポインタの使い方を質問したかったです。

関連するQ&A

  • 入れ子の構造体について

    例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?

  • 構造体の配列を関数に渡すには

    構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

  • データ数の多い構造体配列について

    visual c++で配列をメンバーに持つ構造体配列を定義したいと思っています。 しかし、以下のように定義してもプログラムが実行されません。 配列の容量が大きいのかもしれませんが、 大量のデータを扱いたいので容量を小さくはしたくありません。 大量のデータを扱うのに何かいい方法はないでしょうか。 struct X { double A[1000]; }; : : : struct X B[10000];

  • 構造体メンバ 構造体ポインタ 値代入

    typedef struct _test_t{ int aaa; int bbb; } test_t; typedef struct _globalData{ int xxx; test_t* pTestData[256]; } globalData_t; globalData_t globalData; int main(){ test_t testData1 = {1,1}; test_t testData2 = {2,2}; *globalData.pTestData[1] = testData1; /* (1) */ globalData.pTestData[2] = &testData1; /* (2) */ } 上記のようなグローバルデータの構造体globalData のメンバの構造体配列にtest_t型の構造体を格納し保持するには、 (1)、(2)のどちらが正しいでしょうか?

  • 構造体を引数で関数へ渡す

    こんばんは。現在C言語を学んでいます。 課題という形で構造体で定義されたデータを関数の引数に当てはめ、データを渡すという処理を行わねばならぬのですが、関数を利用しての構造体の受け渡しが分からず苦戦しております。ご助言頂ければ幸いです。 分かりづらいかとは思いますが下記が私が簡単にですが作ったものとなります。 私の考えている動作プロットとしては 1. 構造体の形式を定義する。 2. 冒頭にて存在する関数を定義 3. main関数内にて構造体に名前を付けて定義し、値を入力より受付 4. do_it_hoge関数に構造体を引数として与え(ここが分からず)関数を呼び出す。 5. 関数内にて引数で受け取った &hoge.a,b,c等を表示するなどしたい。(受け取る方法が分からず) 関数を呼ぶ際にカッコ内に入れるのは構造体の名前のみで良いのでしょうか? (例: do_it_hoge(hoge); のように) また呼び出される関数側の括弧は何を記述するのでしょうか? いつもならint hogehoge, や char hoge, などと宣言しているかと思うのですが。 読みづらく、分かりにくいものかとは思いますが どうぞ宜しくご教授頂ければと思っております。 構造体を触るのが久しぶりだったのでそちらでミスがあるかもしれません。もし何か補足等必要でしたらメッセージ頂ければ返事させていただきたいと思います。 //----------------------------------------------------------------// //構造体HOGEHOGE定義 //----------------------------------------------------------------// typedef struct tagHOGEHOGE { int a,b; int c; }HOGEHOGE; void do_it_hoge();//関数定義。ここでのカッコ内の定義も不明 //----------------------------------------------------------------// // main //----------------------------------------------------------------// void main(){ HOGEHOGE hoge;//hogeをHOGEHOGE利用で定義 scanf("%d,%d",&hoge.a,&hoge.b);//カンマ区切りで代入 scanf("%d",&hoge.c);//数値をhoge.cへ do_it_hoge();//←ここが分からず } //----------------------------------------------------------------// // do_it_hoge 関数。構造体を引数で受け取りたい関数。 //----------------------------------------------------------------// void do_it_hoge(){ // ←括弧内の受け方が分からず // ここでmainで入力された &hoge.aなどを参照して表示したい // 例: printf("hogeA:%d",&hoge.a); } //----------------------------------------------------------------//

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • 配列を含む構造体の初期値について

    gccのワーニングメッセージの意味が分からないの で質問させてください。 // ************************** void Vfunc1(void) {} void Vfunc2(void) {} typedef void(*VFUNC)(void); typedef struct { VFUNC svc[2]; } VFUNC_STR ; const VFUNC_STR VfuncStr = { Vfunc1,Vfunc2 }; // ************************** 関数配列を引き渡しする構造体を作っているのです が、以上のソースをgccでコンパイルすると、 warning: missing braces around initializer warning: (near initialization for 'VfuncStr.svc') というワーニングが出ます。 ところが構造体定義を // ************************** typedef struct { VFUNC svc1; VFUNC svc2; } VFUNC_STR ; // ************************** と記述し直すとワーニングは出ませんでした。 どういう問題なのでしょうか? メンバ svcを配列表現しないと使いづらいので、ど う表現すればワーニングを回避できるのかご教示く ださい。 ちなみに // ************************** const VFUNC svc[2] = { Vfunc1,Vfunc2 }; // ************************** と記述してもワーニングは出ないので、構造体のメン バとして記述すると、 svcが配列へのポインタと認識 されて実体を外に作成してしまうのかなと想像してい ます。

  • 構造体の継承?再定義?

    タイトルをどう書いてよいか分からなかったので あいまいなタイトルになってしまって申し訳ないです。 見て頂き有難う御座います。 どちらかと言えばCプログラミングのノウハウについて質問です。 ある構造体定義があります。 typedef struct _A{ int a; int b; }A; これを以下のように定義し直し、ユーザには Bの名前で公開させたいと考えています。 typedef A B; なぜかと言うと、Aはハード寄りの定義の為、 ハードの定義名を意識させない為にBの名前にした方が分かりやすいと 考えた為です。 このような実装により、分かりやすくなりますでしょうか? また、他に理想的な実装方法はありますでしょうか? よろしくお願い致します。

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 多次元配列の構造体の初期化

    タイトル通りです。やり方がわかりません。 構造体変数の初期化や多次元配列の初期化が載ってるページは多いのですが、コレだけは調べても解りませんでした。 typedef struct{ int flag; ~~~~~(略)~~~ }map_t; map_t map[64][64]; の後、map_t型のmap64*64の int flag全てに値を代入したいのですが 詳しいやり方が解りません。 int hensuu[3][3]={   {1,2,3},{4,5,6},{7,8,9} }; 普通の多次元配列みたいにmこんな感じでやりたいんですけど… 初心者でスミマセン。回答いただけたらありがたいです。

専門家に質問してみよう