2016-08-16 15 views
-2

ので、私は、次の構造体を得た:別の構造体の内部で構造体の配列を初期化するにはどうすればよいですか?

typedef struct typeData{ 
    char name[20]; 
    double weightIn; 
    double weightOut; 
}dataType; 

typedef struct fifoTable{ 
    unsigned short int start; 
    unsigned short int end; 
    dataType data[N]; 
} fifoTable; 

と構造体を初期化することになって、次の機能:「割り当て:

fifoTable *initFifo(){ 
    fifoTable table; 
    table.start = 0; 
    table.start = 0; 
    dataType data[N]; 
    table.data = data; 
    return table; 
} 

私が遭遇した問題は、私はエラーメッセージを言ってしまうことがあり配列型の式への変換」を参照してください。私はそれを見て、私はそれのような構造体内の配列を初期化することは不可能だと思った。 char、intなどの配列を使った例がいくつか見つかりましたが、dataType構造体内に他の要素があるため、このテーブルを初期化する方法が見つかりません。

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

+2

初期化コードでポインタとしてスタック変数を返そうとしています。 mallocを使うべきです。 –

+0

@ChristopherSchneider:C言語にスタックはありません。 'table'は自動変数です。しかし、はい、変数は戻り値の後に寿命があります。したがって、アクセスはすべてUBです。しかし、これはコンパイラエラーの理由ではありません。 – Olaf

+0

@Olafどこで読むことができますか?私が聞いたのはこれが初めてのことです。 –

答えて

1

これはいくつかの理由で機能しません。

まず、配列は割り当て可能な左辺値ではありません。これは、あなたがしようとしているように課題の左側に表示されないことを意味します。

初期化(変数が定義された時点で発生する)は、割り当てと同じではありません。たとえば、あなたはこれを行うことができます。

int a[3] = { 3, 4, 5 }; 

ではなく、これを:fifoTable *を返すように宣言している間あなたはまた、あなたの関数からfifoTableを返している

int a[3] = { 3, 4, 5 }; 
int b[3]; 
b = a; 

おそらく、あなたの構造体に動的にメモリを割り当て、それを0にしてポインタを返すことです。あなたはやることを次のように

fifoTable *initFifo(){ 
    fifoTable *retval = calloc(1, sizeof(fifoTable)); 
    if (!retval) { 
     perror("calloc failed"); 
     exit(1); 
    } 
    return retval; 
} 
1

あなたがスタック上に「データ」と「テーブル」を宣言し、それへのポインタを返すが、ポインタが無効であるので、それらの宣言のスコープは、関数で終了します。

"fifoTable"を返す場合は、mallocを使用してストレージを割り当て、そのポインタを返します。

fifoTable *initFifo(){ 
    fifoTable* table = malloc(sizeof(fifoTable)); 
    table->start = 0; 
    table->start = 0; 
    dataType data[N]; 
    /* initialize data somehow */ 
    memcpy(table.data, data, sizeof(table.data)); 
    return table; 
} 
+1

メンバーデータを直接設定しないのはなぜですか? – 2501

1

問題1

問題... "配列型を持つ式に代入"。

table.data = data; 

私はこのような構造体の内部で配列を初期化することはできません考え出し。

コードは、を初期化するではありません。コードがの割り当てを実行しようとしています。

memcpy()

memcpy(table.data, data, sizeof table.data);` 

通報2

関数の戻り型がポインタで使用し、別の配列に、配列の内容をコピーする:fifoTable *、まだコード構造を返そうと:fifoTable

fifoTable *initFifo(void){ 
    fifoTable table; 
    ... 
    return table; 
} 

)より一般的であるポインタを返す、おそらくそれを割り当てることにより、有効なmemroyへのポインタを返し、ポインタを戻すに

fifoTable initFifo(void){ 
    fifoTable table; 
    ... 
    return table; 
} 

に一致するように戻り型を宣言する。

fifoTable *initFifo(void) { 
    return calloc(1, sizeof(fifoTable)); 
} 

問題3(タイトル質問)

は、どのように私は別の構造体の内部構造体の配列を初期化することができますか?

一度に1つの要素。

#define N 4 

fifoTable initFifo(void) { 
    dataType data[N]; 
    fifoTable table = { 0, 0, {data[0], data[1], data[2], data[3]} }; 
    return table; 
} 
関連する問題