アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

ちょっと長くなりますが、いいですか?


まず、配列の定義を構造体のメンバではなく、
実体定義にします。
そして、配列のポインタと、そのデータ長(要素数)をメンバにもつ構造体Aを作成します。
そして、Aを100個の配列にしたメンバを持つ構造体Bを作成します。
そうするとForループでアクセス可能になります。
相当わかりにくいと思うので、
以下にサンプルコードを書きます。
ちなみにこのデータ構造はコードメンテナンスを楽にする手法で、配列の中身や大きさが変更になっても、ロジックは変更せずに、データ定義だけの変更ですみます。

#define A1_SIZE (10) // A1の配列数
#define A100_SIZE (20) // A100の配列数
#define An_MAX_NUM (100) // データ数

/* 配列そのものの定義 */
chara1[A1_SIZE] ;// a1データ
/* 中略 */
chara100[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 );
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/06/02 11:03

普通に


test.a1
test.a2
ですよ。
数字の部分を書き換えれば好きなところにアクセスできます。

構造体の中身を char a[100][20];
とでもすればa1,a2の代わりにa[1],a[2]と出来ると思った。
    • good
    • 1

本来、そのようなプログラマがこまるような構造体は作らないはずです。

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

おおざっぱには「構造体じゃないとしたらどうするか」を想定して, そこに「じゃあ構造体ならどうするか」を追加すればいいんじゃないかなぁ. ぱっと思い付くものとしては,


・switch でがんばる
・オフセットの配列を作る
・(C++ なら) メンバへのポインタの配列を作る (本質的には上と同じ)
・構造体を作り直す
くらいでしょうか.
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/06/02 11:00

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