構造体の中の構造体で定義した、空の配列はどのような使い道があるのですか?

解決


  2009-10-15 18:50:13  No: 71016

初めまして、いつも参考にさせてもらっております。
DirectShowのソースを見ていて疑問に思ったのですが
このような構造体があります。
typedef struct _avioldindex {
 FOURCC  fcc;        // 'idx1'
 DWORD   cb;         // size of this structure -8
 struct _avioldindex_entry {
  DWORD   dwChunkId;
  DWORD   dwFlags;

  #ifndef AVIIF_LIST
  #define AVIIF_LIST       0x00000001
  #define AVIIF_KEYFRAME   0x00000010
  #endif
     
  #define AVIIF_NO_TIME    0x00000100
  #define AVIIF_COMPRESSOR 0x0FFF0000  // unused?
  DWORD   dwOffset;    // offset of riff chunk header for the data
  DWORD   dwSize;      // size of the data (excluding riff header size)
  } aIndex[];          // size of this array
} AVIOLDINDEX;

質問1:このstruct _avioldindex_entryの空の配列aIndex[]はどのような目的でこういった定義になっているのでしょうか?

質問2:そもそも何故構造体の中だと、空の配列が定義できるのですか?

質問3:簡単にしてみたのですが、どのような使い道があるかわかりません
typedef struct s{
 struct ss{
  char c;
 } ass[];
} S;
S x; // sizeof(S);は1バイト
S::ss y;
y.c = 'C';
x.ass[0] = y;

環境はWinXP SP3 VC++6.0です。
宜しくお願いいたします。


Blue  2009-10-15 19:00:12  No: 71017

参考
ロベールのC++教室 - 第15章 伸縮自在 -
http://www7b.biglobe.ne.jp/robe/cpphtml/html03/cpp03015.html


tetrapod  2009-10-15 19:09:08  No: 71018

むしろこっちのほうがわかりやすいかもしれない
http://seclan.dll.jp/c99d/c99d04.htm
の 4.2


  2009-10-15 22:35:42  No: 71019

Blue様
tetrapod様
回答してくださりありがとう御座いました。

ご両人が教えて下さったサイトを参考に...

質問1:このような感じで使えました。
const int count = 5;
const int size = sizeof(AVIOLDINDEX) + sizeof(AVIOLDINDEX::_avioldindex_entry) * count;
AVIOLDINDEX* p;
p = (AVIOLDINDEX*)new BYTE[size];
file.Read(p, size);
for(int i=0; i<count; i++)
 TRACE("%x\n", p->aIndex[i].dwChunkId);

質問2:[ ] の中の大きさは、構造体の最後のメンバである時に限って省略することができる。

質問3:1と同じ

教えていただいたサイトの別のトピックも興味深かったので、暇を見て読み進めたいと思います。
ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加