• ベストアンサー

構造体のメンバへのアクセスについて

お世話になります。 構造体testがあり そのメンバにchar a1[10],a2[20]・・・a100[20]まであるとします。 (配列サイズは不定) このときtest.an (nは任意の数値)にアクセスしたいのですが どう記述したらいいでしょうか? どなたかご指南お願いします。

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

  • ベストアンサー
  • hinaken
  • ベストアンサー率100% (5/5)
回答No.3

ちょっと長くなりますが、いいですか? まず、配列の定義を構造体のメンバではなく、 実体定義にします。 そして、配列のポインタと、そのデータ長(要素数)をメンバにもつ構造体Aを作成します。 そして、Aを100個の配列にしたメンバを持つ構造体Bを作成します。 そうするとForループでアクセス可能になります。 相当わかりにくいと思うので、 以下にサンプルコードを書きます。 ちなみにこのデータ構造はコードメンテナンスを楽にする手法で、配列の中身や大きさが変更になっても、ロジックは変更せずに、データ定義だけの変更ですみます。 #define A1_SIZE (10) // A1の配列数 #define A100_SIZE (20) // A100の配列数 #define An_MAX_NUM (100) // データ数 /* 配列そのものの定義 */ char a1[A1_SIZE] ; // a1データ /* 中略 */ char a100[A100_SIZE] ; // a100データ /* データ定義構造体 */ typedef struct { char *data; // データのアドレス int datalen ; // データ長 } tDATA_DEF ; /* データ管理構造体 */ typedef struct { tDATA_DEF data_def[An_MAX_NUM]; } tDATA ; /* データと管理構造体のリンク */ const tDATA tData = { /* A1データ */ { a1, // データのアドレス A1_SIZE // データ長 }, /* 中略 */ /* A100データ */ { a100, // データのアドレス A100_SIZE // データ長 }, } void main() { int i ; /* 可変長のデータを0クリアする */ for( i=0; i<An_MAX_NUM; i++ ) { memset( tData.data_def[i].data, 0, tData.data_def[i].datalen ); } }

coralieclement
質問者

お礼

参考となるソースまで書いていただいて本当に助かりました。 どうもありがとうございました。

その他の回答 (3)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

普通に test.a1 test.a2 ですよ。 数字の部分を書き換えれば好きなところにアクセスできます。 構造体の中身を char a[100][20]; とでもすればa1,a2の代わりにa[1],a[2]と出来ると思った。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

本来、そのようなプログラマがこまるような構造体は作らないはずです。どうしてそのような構造体が作成されたのか、非常に興味があります。よろしければ、そのような構造体が作成された背景を教えていただけませんでしょうか。そうすれば、もしかしたら、別の解決方法が見つかるかも知れません。

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

おおざっぱには「構造体じゃないとしたらどうするか」を想定して, そこに「じゃあ構造体ならどうするか」を追加すればいいんじゃないかなぁ. ぱっと思い付くものとしては, ・switch でがんばる ・オフセットの配列を作る ・(C++ なら) メンバへのポインタの配列を作る (本質的には上と同じ) ・構造体を作り直す くらいでしょうか.

coralieclement
質問者

お礼

お礼が遅くなってしまって大変もうしわけありませんでした。 メンバへのポインタの配列を作って実装することにしました。 どうもありがとうございました。

関連するQ&A