初めまして、いつも参考にさせてもらっております。
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です。
宜しくお願いいたします。
参考
ロベールのC++教室 - 第15章 伸縮自在 -
http://www7b.biglobe.ne.jp/robe/cpphtml/html03/cpp03015.html
むしろこっちのほうがわかりやすいかもしれない
http://seclan.dll.jp/c99d/c99d04.htm
の 4.2
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と同じ
教えていただいたサイトの別のトピックも興味深かったので、暇を見て読み進めたいと思います。
ありがとうございました!
ツイート | ![]() |