3

したがって、次のように C 配列を初期化できます。

CGFloat colors[8]= {1,0.5,0.5, 1,
    0.5,0.2,0.2, 1};

定義したいcolors[8]が、条件付きで 8 つの値を割り当てるとどうなりますか。これは可能ですか?もしそうなら、私は正しい構文を見つけることができません。このようなもの:

CGFloat colors[8];
if (red){
colors= {1,0.5,0.5, 1,
    0.5,0.2,0.2, 1};
}else
 //assign colors to something else

さまざまな構文を試しましたが、何も機能しません。私はそれが不可能だと思いますか?

4

4 に答える 4

8

この割り当て方法はアレイの初期化時にのみ許可されるため、これは機能しません。あなたができることは:

CGFloat colors[8];
if (red){
    CGFloat temp[] = {1,0.5,0.5, 1, 0.5,0.2,0.2, 1};
    memcpy(colors, temp, sizeof(colors));
}
else
{
    // ...
}
于 2012-08-07T07:15:10.467 に答える
1

最近の C コンパイラがあり、C99 を使用している場合は、次のことができます。

CGFloat *const colors =
 red 
 ? (CGFloat[8]){ 1, 0.5, 0.5, 1, 0.5, 0.2, 0.2, 1}
 : (CGFloat[8]){ /* put other values here */ };

ポインタconst*変更できませんが、データは変更できます。がコンパイル時の整数定数である場合red、適切なコンパイラはそのために 1 つの配列のみを予約できるはずです。

また、配列の要素が変更されないことも知っています。さらに追加できますconst

CGFloat const*const colors =
 red 
 ? (CGFloat const[8]){ 1, 0.5, 0.5, 1, 0.5, 0.2, 0.2, 1}
 : (CGFloat const[8]){ /* put other values here */ };

red次に、優れたコンパイラは2つの配列を静的に割り当てることができます(許可されます)。したがって、 が定数でない場合により効率的なものを生成します。

于 2012-08-07T07:54:57.323 に答える
1

次のようなことを試してください、多分...

CGFloat colors_red[8] = { 1, 0.5, 0.5, 1, 0.5, 0.2, 0.2, 1};
CGFloat colors_other[8] = ...;
...
const CGFloat *colors = red ? colors_red : colors_other;

元のデータのコピーが必要な場合 (つまり、またはを変更colorsして再利用する予定がある場合)、次を使用する必要があります( で宣言):colors_redcolors_othermemcpy<string.h>

CGFloat colors[8];
memcpy(colors, red ? colors_red : colors_other, sizeof colors);
于 2012-08-07T07:18:23.287 に答える
0

次のようなことをする必要があります

if(red) {
    colours[0] = 1;
    colours[1] = 0.5;
    colours[2] = 0.5;
    ...
    colours[7] = 1;
} else {
    ...
}
于 2012-08-07T07:18:10.630 に答える