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

尝试以下类似的方法,也许......

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_redor colors_other),那么您应该使用memcpy(在 中声明<string.h>):

CGFloat colors[8];
memcpy(colors, red ? colors_red : colors_other, sizeof colors);
于 2012-08-07T07:18:23.287 回答
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是一个编译时整数常量,任何体面的编译器都应该能够为此只保留一个数组。

我你也知道数组的元素永远不会改变你可以添加更多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然后一个好的编译器可以(将被允许)静态分配两个数组,从而在不是常量的情况下产生更有效的东西。

于 2012-08-07T07:54:57.323 回答
0

你需要做类似的事情

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