プロが教えるわが家の防犯対策術!

C,C++でソフトを組んでいます。
質問はシンボルの割付け方法です。
例えば、
boolean_symbol ← BOOLEAN
bynary_symbol ← BYNARY
word_symbol  ← WORD
long_symbol  ← LONG

の様に上記4つのシンボルを宣言したいとします。
これを
↓質問 シンボル名   宣言要素数
********* boolean_symbol, 1 → boolean_symbol
********* bynary_symbol, 2 → bynary_symbol[2]
********* word_symbol, 3 → word_symbol[3]
********* long_symbol, 4 → long_symbol[4]

上記の様に表記して、連続したメモリ上にシンボルを
割付けたいと思っています(分かりにくいでしょうか)。
このシンボル宣言だけで1ファイルとして分かり易く
宣言したいんですが、いい方法が見つかりません。
連続したメモリ上に任意の型、要素数を持たせるマクロ
やその他の方法がありましたらご教授ください。
宜しくお願い致します。

A 回答 (2件)

あのう、余計なお世話かもしれませんが・・・



>具体的にいうと下記の様に宣言して
>AAA(ULONG( long_symbol , 1), CONT)
>AAA(UCHAR( bynary_symbol , 2), CONT)

使い方、これ見ても分からないんですが・・・
特に、CONTって一体何?

>&H00000 1
>&H00004 2
>&H00005 3

この表記は何ですか?VBですか?
C,C++というのなら、それなりの書き方というものがあるんですが。

bynary→binaryですし。


うだうだ言っててもしょうがないんで。

こんな感じにマクロ定義したらできますかねぇ?
#define DEC_START struct name{
#define DEC_END(name) } name;
#define FACT(type, name, size) name type[size];


で、使用する関数の中で、

DEC_START
FACT(ULONG, long_symbol, 1)
FACT(UCHAR, bynary_symbol, 2)
DEC_END(aaa)
と宣言し、

aaa.long_symbol = 1;
aaa.bynary_symbol[0] = 2;
aaa.bynary_symbol[1] = 3;
とすれば、近いことは出来ると思いますが。


なお、連続したメモリ領域を確保する場合にはアライメントに注意する必要がありますんで、1byte確保した次にlongを確保すると穴があきます。これを避けるには、コンパイルオプションを変えれば可能ですが、実行速度が遅くなるのでお勧めしません。

あと、C、C++ではビット単位で領域は確保できません。

本当は何がされたいのでしょうか?
    • good
    • 0

typedef struct {


bool flag;
uint8_t bin[2];
uint16_t word[3];
uint32_t lng[4];
} Sym_t;

のように構造体を型定義するとか。

採取的な「何がしたい」(例えば「固定長データファイルを読み込みたい」とか。)ってのを、きちん説明しとくと、回答がつきやすいと思います。

この回答への補足

具体的にいうと下記の様に宣言して
AAA(ULONG( long_symbol , 1), CONT)
AAA(UCHAR( bynary_symbol , 2), CONT)

ソース内で下記の様にシンボルをそのまま使え
long_symbol = 1;
bynary_symbol[0] = 2;
bynary_symbol[1] = 3;

メモリ上は
&H00000 1
&H00004 2
&H00005 3

となるようにしたいんです

補足日時:2003/09/20 15:01
    • good
    • 0

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