ページ 11

マクロの引数によって取ってくる変数を選ぶ

Posted: 2013年4月16日(火) 21:01
by chilling_s
C言語のマクロで、引数によって持ってくる構造体を選ぶようなことはできますか?
やりたいことは下記のような感じです
構造体に番号がついていて指定した番号の構造体が取得したいです
配列じゃなくて、マクロでやりたいのです
好きな番号の構造体の値が取ってこれれば、出力はポインタでもコピーでも何でも良いのですが・・・
どなたか分かる方いましたらご教授いただけますと幸いです


:
:

typedef struct _HOGE {
[tab=30]int value;
}HOGE

HOGE hoge1;
HOGE hoge2;
HOGE hoge8;

void main(void) {
[tab=30]HOGE *hoge_local;

[tab=30]hoge1->value = 1;
[tab=30]hoge2->value = 2;
[tab=30]hoge8->value = 8;
[tab=30]hoge_local = GET_MACRO(8); /* こんな感じでhoge8の内容が取りたい */
[tab=30]printf("value = %d", hoge_local->value); /* こんな感じでvalue=8と出力されてほしい */
}

Re: マクロの引数によって取ってくる変数を選ぶ

Posted: 2013年4月16日(火) 21:08
by h2so5
##によってマクロの引数をシンボル名に連結することができます。

コード:

#define GET_MACRO(num) hoge ## num

GET_MACRO(8) /* hoge8 と同じ */

Re: マクロの引数によって取ってくる変数を選ぶ

Posted: 2013年4月16日(火) 23:57
by chilling_s
ありがとうございます。
##8で変数名に変換できるのですね。
しかし、##はプリプロセッサディレクティブである為、固定値のみしか使えないのですよね?

8の部分を変数を使って指定したいのですが、他に代案ありますでしょうか?
説明足らず大変申し訳ありません。

Re: マクロの引数によって取ってくる変数を選ぶ

Posted: 2013年4月17日(水) 00:02
by softya(ソフト屋)
>8の部分を変数を使って指定したいのですが、他に代案ありますでしょうか?
マクロでどうにかなる問題ではないので、同じ構造体で番号違いなら配列にすれば良いのではないでしょうか?

Re: マクロの引数によって取ってくる変数を選ぶ

Posted: 2013年4月17日(水) 22:26
by chilling_s
softya(ソフト屋) さんが書きました:>8の部分を変数を使って指定したいのですが、他に代案ありますでしょうか?
マクロでどうにかなる問題ではないので、同じ構造体で番号違いなら配列にすれば良いのではないでしょうか?
ありがとうございます。
そうですね、マクロで簡潔にできればと思いましたが残念ながらそれはできなそうですね。
配列に出来れば良いのですが添字が大きく飛び飛びでメモリ不足になる為、NGでした。
今回は番号毎に構造体変数を1個1個定義します。

Re: マクロの引数によって取ってくる変数を選ぶ

Posted: 2013年4月17日(水) 22:53
by みけCAT
chilling_s さんが書きました:配列に出来れば良いのですが添字が大きく飛び飛びでメモリ不足になる為、NGでした。
連想配列を使用するか、
あらかじめ使用する添字が分かっていればその添字一覧を配列に格納し、二分探索で対応する位置を求める、という方法があります。