将值分配给C数组

时间:2012-08-07 07:12:59

标签: objective-c c

所以,我可以像这样初始化一个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 个答案:

答案 0 :(得分: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
{
    // ...
}

答案 1 :(得分: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_other),则应使用memcpy(声明为<string.h>):

CGFloat colors[8];
memcpy(colors, red ? colors_red : colors_other, sizeof colors);

答案 2 :(得分: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不是常量的情况下产生更高效的东西。

答案 3 :(得分:0)

您需要执行类似

的操作
if(red) {
    colours[0] = 1;
    colours[1] = 0.5;
    colours[2] = 0.5;
    ...
    colours[7] = 1;
} else {
    ...
}