C言語関係掲示板

過去ログ

No.960 構造体サイズの固定

[戻る] [ホームページ]
No.12283

構造体サイズの固定
投稿者---Jum(2004/01/29 10:18:17)


初めまして、Jumと言います。

構造体のメンバを増減させても、構造体のサイズを固定させておきたいのですが
ダミーのメンバを入れる方法以外に方法はありますでしょうか?

基本的な質問ですが、宜しくお願い致します。

No.12287

Re:構造体サイズの固定
投稿者---ともじ(2004/01/29 10:36:34)


>構造体のメンバを増減させても、構造体のサイズを固定させておきたいのですが
>ダミーのメンバを入れる方法以外に方法はありますでしょうか?

共用体を使ってはいかがでしょう。

No.12292

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 12:22:03)


ご回答ありがとうございます。

>共用体を使ってはいかがでしょう。

なるほど共用体ですか。

現在

typedef struct
{
  char m_cTest1[32];
  char m_cTest2[32];

  char dummy[64];
}DATA;

というようにしておりますが、共用体となると

typedef struct
{
  union
  {
    char m_cTest1[32];
    char m_cTest2[32];

    char dummy[128];
  }
}DATA;

こうしてしまうとm_cTest1、m_cTest2も同じメモリになってしまいますね…

typedef struct
{
  char m_cTest1[32];
  char m_cTest2[32];
}SUB;

typedef struct
{
  union
  {
    SUB sub;

    char dummy[128];
  }
}DATA;

こうすれば固定できますが、m_cTest1、m_cTest2はDATA構造体直下のメンバとして
置いておきたいので、この方法は避けたいのですが、この方法以外に何か良い手は
ありますでしょうか…

以上宜しくお願い致します。


No.12294

Re:構造体サイズの固定
投稿者---nop(2004/01/29 12:31:21)


>こうすれば固定できますが、m_cTest1、m_cTest2はDATA構造体直下のメンバとして
>置いておきたいので、この方法は避けたいのですが、この方法以外に何か良い手は
>ありますでしょうか…
typedef union
{
    typedef struct
    {
        char m_cTest1[32];
        char m_cTest2[32];
    };
    char dummy[128];
}DATA;


と言う形式では?

No.12296

Re:構造体サイズの固定
投稿者---ともじ(2004/01/29 12:54:00)


>typedef union
>{
>    typedef struct
>    {
>        char m_cTest1[32];
>        char m_cTest2[32];
>    };
>    char dummy[128];
>}DATA;
>
>と言う形式では?

はい、これを考えていました。例を書かず、わかりづらくて申し訳ありませんでした。



No.12297

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 13:35:44)


ご回答ありがとうございます。

>typedef union
>{
> typedef struct
> {
> char m_cTest1[32];
> char m_cTest2[32];
> };
> char dummy[128];
>}DATA;

おぉ、なるほど!と思い早速変更してみましたが

anonymous class type not used to declare any objects
(直訳:どんなオブジェクトも宣言するためには使用されない匿名のクラス・タイプ)

というエラーによって玉砕しました…

構造体名を指定しなければいけないのか、コンパイラの問題なのか…

ちなみにFreeBSD・gcc2.95.4で試してみました。

以上宜しくお願い致します。


No.12300

Re:構造体サイズの固定
投稿者---おでん(2004/01/29 14:02:10)



typedefのなかにtypedefってかけましたっけ?

No.12302

Re:構造体サイズの固定
投稿者---ともじ(2004/01/29 14:35:47)


>typedefのなかにtypedefってかけましたっけ?

よく見ていませんでした。すみませ〜ん。
typedef union {
	struct {
		char m_cTest1[32];
		char m_cTest2[32];
	}m;
	char dummy[128];
}DATA;




No.12303

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 14:40:31)


ご回答ありがとうございます。

> typedef union {
> struct {
> char m_cTest1[32];
> char m_cTest2[32];
> }m;
> char dummy[128];
> }DATA;

これで動作しました♪

度々の書き込みに丁寧にお答えして頂きありがとうございました。


No.12298

Re:構造体サイズの固定
投稿者---かずま(2004/01/29 13:44:03)


> こうすれば固定できますが、m_cTest1、m_cTest2はDATA構造体直下のメンバとして
> 置いておきたいので、この方法は避けたいのですが、この方法以外に何か良い手は
> ありますでしょうか…

マクロを使うのはいかがでしょうか?
#include <stdio.h>
#include <stddef.h>

#define STRUCT(name, size, members)       \
    struct name##_ { members char m_; };  \
    typedef struct {                      \
        members char m_[size - offsetof(struct name##_, m_)];  \
    } name

STRUCT(DATA, 128,
    char m_cTest1[32];
    char m_cTest2[32];
    /* ここにメンバを追加 */
);

int main(void)
{
    DATA data;

    printf("sizeof data = %d\n", sizeof data);
    return 0;
}

ただし、追加するメンバに「,」を含んではいけません。
int a, b; はダメで、int a; int b; とすること。


No.12301

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 14:28:35)


ご回答ありがとうございます。

>#define STRUCT(name, size, members) \
> struct name##_ { members char m_; }; \
> typedef struct { \
> members char m_[size - offsetof(struct name##_, m_)]; \
> } name

こういう方法もあるのかと試してみました。

test.c:29: syntax error before `#'

とエラーが出てしまいました…
やはりコンパイラの影響が大きいのでしょうか…

以上宜しくお願い致します。


No.12305

Re:構造体サイズの固定
投稿者---NykR(2004/01/29 15:04:35)


>test.c:29: syntax error before `#'
>
>とエラーが出てしまいました…
>やはりコンパイラの影響が大きいのでしょうか…
>
>以上宜しくお願い致します。

29行目に何があるのかわからなければお願いされてもどうしようもありません。
元のプログラムは23行しかないわけですから。

No.12307

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 15:11:45)


申し訳ございません…
29行目は

> struct name##_ { members char m_; }; \

です。

どうも##に引っかかっている模様です。
すみませんでした。

とりあえず上記にて

> typedef union {
> struct {
> char m_cTest1[32];
> char m_cTest2[32];
> }m;
> char dummy[128];
> }DATA;

この方法で行けましたので解決とさせて頂きます。

ご忠告ありがとうございました。

No.12312

Re:構造体サイズの固定
投稿者---かずま(2004/01/29 15:32:36)


> 29行目は
>
>> struct name##_ { members char m_; }; \
>
> です。
> 
> どうも##に引っかかっている模様です。

gcc は、マクロ定義の ## を正しく解釈できるはずです。

1行目から、29行目までをすべて示してください。その場合、
【掲示板ご利用上の注意】に従って、「HTML変換ツール」を使用してください。


No.12315

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 15:52:37)


原因がわかりました。

Win上で編集しサーバーへ転送後コンパイルしていたのですが、文字コードの設定により
サーバー上で編集する時に確認しますと行末の「\」が「\^M」となっていました。
これによりコンパイルが通らなかった模様です。

「\^M」を「\」にすることでエラーはなくなりました。

ご迷惑をおかけして申し訳ありませんでした。


No.12310

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 15:27:52)


行けました!と言ってしまいましたが肝心な事を忘れておりました。
申し訳ございません…

> typedef union {
> struct {
> char m_cTest1[32];
> char m_cTest2[32];
> }m;
> char dummy[128];
> }DATA;

この方法ではサイズは固定されますが、m_cTest1、m_cTest2をDATA直下のメンバとして認識できませんでした。

DATA Data;

printf("%s\n",Data.m_cTest1);

とした場合にprintfの行で

`union DATA' has no member named `m_cTest1'

というエラーが出てしまいました…
宣言の仕方が悪いのでしょうか…

以上宜しくお願い致します。

No.12316

Re:構造体サイズの固定
投稿者---ともじ(2004/01/29 15:55:28)


>DATA Data;
>
>printf("%s\n",Data.m_cTest1);

 printf("%s\n", Data.m.m_cTest1);

としてください。


No.12318

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 16:07:43)


ご回答ありがとうございます。
unionとstructでは

Data.m_cTest1

というData直下のm_cTest1は実現不可能なんですね…

ともじさんとかずまさんの方法のどちらかで実装してみたいと思います。
丁寧なご回答ありがとうございました。

No.12322

Re:構造体サイズの固定
投稿者---nop(2004/01/29 19:02:53)


>この方法ではサイズは固定されますが、m_cTest1、m_cTest2をDATA直下のメンバとして認識できませんでした。
typedef union
{
    struct
    {
        char m_cTest1[32];
        char m_cTest2[32];
    };
    char dummy[128];
} DATA;


では、通りませんか?

No.12327

Re:構造体サイズの固定
投稿者---Jum(2004/01/29 22:03:22)


レスありがとうございます。

>では、通りませんか?

残念ながら通りません…
FreeBSD+gcc2.95.4では通らないのかもしれません。

以上宜しくお願い致します。