所以,我可以像这样初始化一个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
我尝试了各种语法,但没有任何效果。我猜这不可能?
答案 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_red
或colors_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 {
...
}