0

これは簡単な質問のようですが、頭を悩ませることはできません...

いくつかの条件に基づいて、最もエレガントな方法で配列の要素を設定したいと思います。

これは私の非コンパイル擬似コードです:

float*array=NULL;
switch(elements) {
  case 1: array={1}; break;
  case 2: array={7, 1}; break;
  case 3: array={3, 2, -1}; break;
  case 4: array={10, 20, 30, 40}; break;
  default:break;
}

配列のサイズは制限されているので、「floatarray[16];」のようなことができます。同様ですが、問題は明らかにcaseステートメントでの割り当てです。

私は本当に次のようなことをしたくありません:

case 2: array[0]=1; array[1]=2;

私の現在の(不器用な)実装は次のとおりです。

#define ARRAYCOPY(dest, src) for(int i=0;i<sizeof(src)/sizeof(*src);i++)dest[i]=src[i]
// ...
case 2: do {float*vec={1, 2}; ARRAYCOPY(array, vec); } while(0); break;

memcpy()が機能していないように見えるため、ARRAYCOPY定義を使用しています。少なくともやって

float*vec={1, 2}; memcpy(array, vec, sizeof(vec)/sizeof(*vec);

配列に値を入力しませんでした。

もっと良い解決策があるに違いないと思いますか?

4

3 に答える 3

2

には、として実装したものと同様のmemcpy関数があります。指定されたサイズのメモリブロックをコピーします。このサイズは、配列内の要素の数*配列内の要素のサイズです。<string.h>ARRAYCOPY

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

memcpy(destination_array, source_array, number_of_elements * size_of_element);

だから、あなたは持っているだろう

// let's allocate exactly as much space as is needed
float* array = (float*)malloc(elements * sizeof(float));

// and now copy the elements we want
switch(elements) {
  case 1: memcpy(array, (float[]){1}, 1 * sizeof(float)); break;
  case 2: memcpy(array, (float[]){1, 2}, 2 * sizeof(float)); break;
  case 3: memcpy(array, (float[]){1, 2, 3}, 3 * sizeof(float)); break;
  case 4: memcpy(array, (float[]){10, 20, 30, 40}, 4 * sizeof(float)); break;
  default:break;
}
于 2012-05-08T17:02:24.200 に答える
1

どうですか:

float *global[] = {
    NULL,
    (float[]){1},
    (float[]){1, 2},
    (float[]){7, 8, 9},
};


/* ... make sure `elements` is in range */
float *array = global[elements];

編集

あなたは明らかにスイッチを使い続けるのは自由です:

switch(elements) {
case 1:
    array = (float[]){1};
    break;
}
于 2012-05-08T16:56:53.267 に答える
0

いくつかのオプション:

1)使用する可能性のあるすべての配列は、スタック上の別の場所で宣言し、実際に必要な配列にポインタ「配列」を割り当てます。これらのかなり無意味な配列が浮かんでいるのに、これは非常に複雑だと思います。

2)memcpyが機能しないのはなぜですか?配列要素ではなくバイトの観点から考えていることを覚えておいてください。したがって、ターゲットが大きい場合、memcpy(target、source、sizeof(source))は正常に機能するはずです。if(sizeof(target)> sizeof(source)){handleerror}で次のようにラップします。

case 3:
float temp[] = {1.0,2.0,3.0};
memcpy(array, temp, sizeof(temp));

必ずメモリ(スタックまたはヒープ)を割り当て、配列のセマンティックサイズを追跡してください。

于 2012-05-08T17:09:14.620 に答える