2009-09-04 7 views
0

私はテーブルルックアップに基づいて異なる長さの配列を返す関数を持っています。関数内で必要なメモリをmallocしていますが、ポインタから配列をどのように埋めることができますか? コンパイラは、両方の試行(コメント行)で同じエラーを投げています。助けてください!ダイナミックメモリ割り当て後にアレイを初期化する方法は?

int lookup(const char *name, float *factors) { 
    int length; 
    if(!strcmp(name, "foo")) { 
     length = 6; 
     factors = malloc(length * sizeof(float)); 
     // *factors = {0, -0.9, -4.9, -8, -7.8, -23.9}; 
     // factors = {0, -0.9, -4.9, -8, -7.8, -23.9}; 
    } 
    else if(!strcmp(name, "bar")) 
    { 
     length = 4; 
     factors = malloc(length * sizeof(float)); 
     // *factors = {0, -3, -6, -9}; 
    } 
    // ....................... 
    // more else if branches 
    // ....................... 
    else // error: name not found in table 
    { 
     factors = NULL; 
     fprintf(stderr, "name not found in table!!\n"); 
     return 0; 
    } 
    return length; 
} 

答えて

0
static const float[] initials = { .... }; 
factors = malloc(sizeof(initials)); 
memmove(factors,initials,sizeof(initials)); 
+0

私はこの考えを念頭に置いていましたが、もう少しエレガントな方法はありませんか? – Aamir

+0

さて、それはかなりエレガントです。もう一つの解決策は、メモリを割り当てることではなく、単に「factors = initials」を割り当てます。しかし、後で要因を変更する場合は、うまくいかないでしょう。 –

0

私はストレートCをコード化されたので、しばらくして、その軽微なエラーを許すが、基本的な問題は、あなたが動的に初期化するための定数を初期化するための構文を使用しようとしているということです

const float[] initialValue = {0, -0.9, -4.9, -8, -7.8, -23.9}; 
for (int i=0; i<length; i++) 
{ 
    factors[i] = initialValue[i]; 
} 

を試してみてください変数。

+0

申し訳ありませんが、これは機能しません。私は、すべてのルックアップのために戻ってくる異なるベクトルを持っています。 – Aamir

+0

このコードは、** // factors = {0、-0.9、-4.9、-8、-7.8、-23.9}; **の代わりに使用されます。それでもメモリをmallocする必要があります。あなたにはうってつけのソリューションを見つけてうれしいです。 –

+0

実際、「実用的な解決策」(私はあなたが私を参照します)は同じテクニックを使用しています。静的な配列からデータをコピーするだけです。また、両方のソリューションでベクトルごとに1つの静的配列を定義する必要があります。 –

1

アトリビュート[インデックス]を使用します。

関連する問題