0

注:元の質問をより明確にするために書き直しました。

という関数があります

VcStatus readVcard( FILE *const vcf, Vcard **const cardp )

vcf は私が読み取るオープン ファイルで、cardp はカードの配列の先頭へのポインタです。ファイルには複数のカードが含まれます。

readVCard は一度に 1 行ずつファイルを読み取り、関数 parseVcProp を呼び出して行内のキーワードを識別し、それらを構造体の適切な場所に割り当てます。

ここに構造があります

 typedef struct {    // property (=contentline)
    VcPname name;       // property name

    // storage for 0-2 parameters (NULL if not present)
    char *partype;      // TYPE=string
    char *parval;       // VALUE=string

    char *value;        // property value string
    void *hook;         // reserved for pointer to parsed data structure
} VcProp;

typedef struct {    // single card
    int nprops;         // no. of properties
    VcProp prop[];      // array of properties
} Vcard;

typedef struct {    // vCard file
    int ncards;         // no. of cards in file
    Vcard **cardp;      // pointer to array of card pointers
} VcFile;

ファイルには複数のカードが含まれ、カードには複数のプロパティが含まれます。

問題は、1 枚のカードが任意の数のプロパティを持つことができるということです。それらを読み終えるまで、いくつあるかはわかりません。

これが私が理解していないことです。

parseVcProp を適切に使用するには、メモリをどのように割り当てる必要がありますか?

parseVcProp を呼び出すたびに、データを新しい構造体に格納したいのは明らかですが、このメモリを事前に割り当てるにはどうすればよいですか? malloc(sizeof(VcProp)*1) だけですか?

4

3 に答える 3

3
Vcard *getcards(int n) {
  Vcard *c = malloc(sizeof(Vcard) + sizeof(VcProp) * n);
  c->nprops = n;
  return c;
}
于 2011-01-29T02:03:20.583 に答える
2

エラーが発生している特定の行を表示する必要があります。

そうは言っても、柔軟な配列メンバーを含むような構造体のvcard場合、その型の変数を作成することはできません。ポインター変数のみを作成できます。例えば:

vcard *vc = malloc(sizeof(vcard) + n*sizeof(VcProp));

この時点で、vc->prop[0]~vc->prop[n-1]は有効な配列要素です (それぞれの型は ですVcProp)。

柔軟な配列メンバはポインタではなく配列であることに注意してください。

于 2011-01-29T02:03:05.090 に答える
0

混乱させてごめんなさい。私は自分の間違いを理解しました。

物事がおかしくなった理由は、propp が出力ポインターであり、入力ポインターではなく、Vcard->prop を引数として使用しようとしたためです。

于 2011-01-29T02:31:30.730 に答える