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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
chilling_s

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

#1

投稿記事 by chilling_s » 13年前

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と出力されてほしい */
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 13年前

##によってマクロの引数をシンボル名に連結することができます。

コード:

#define GET_MACRO(num) hoge ## num

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

chilling_s

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

#3

投稿記事 by chilling_s » 13年前

ありがとうございます。
##8で変数名に変換できるのですね。
しかし、##はプリプロセッサディレクティブである為、固定値のみしか使えないのですよね?

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

>8の部分を変数を使って指定したいのですが、他に代案ありますでしょうか?
マクロでどうにかなる問題ではないので、同じ構造体で番号違いなら配列にすれば良いのではないでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

chilling_s

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

#5

投稿記事 by chilling_s » 13年前

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#6

投稿記事 by みけCAT » 13年前

chilling_s さんが書きました:配列に出来れば良いのですが添字が大きく飛び飛びでメモリ不足になる為、NGでした。
連想配列を使用するか、
あらかじめ使用する添字が分かっていればその添字一覧を配列に格納し、二分探索で対応する位置を求める、という方法があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る