给C数组分配值

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个回答

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
{
    // ...
}

我认为需要使用memcpy函数,而不能简单地将一个数组设置为另一个数组吗? - johnbakers
@andrewx:在C语言中,只有当数组被等效的“struct”/“union”类型包装时,才会发生复制数组的赋值。 - jxh
如果我的两个数组都是 CGFloat,由于它们都属于相同的结构体,我应该能够将一个数组分配给另一个数组,而无需使用 memcpy 吗? - johnbakers
struct Foo { float arr[3]; }; struct Foo a = { { 1., 2., 3. } }; struct Foo b = a; - jxh
@user315052 只是顺便提一下,你应该 不要 创建这样的结构体来复制一个数组,而是直接使用 memcpy - obataku
虽然这个例子并不完美,但它确实阐明了我的观点。感谢提供这个例子。 - johnbakers

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);

你代码第三行的那个星号(*)是打错了吗?CGFloat不是一个对象。 - johnbakers
@andrewx 不,我声明 colors 为指向 const CGFloat 的指针。 - obataku
我认为需要使用memcpy,而不能仅将一个数组设置为另一个数组的值? - johnbakers
你可以将指针分配给数组,只要你不打算改变colors并重复使用red_colorsother_colors,这样就没问题了。但是如果你想重复使用它们并且改变colors,那么你需要进行复制,因此需要使用std::memcpy - obataku
2
@veer - 这不是C++,不需要使用std:: - MByD
@BinyaminSharet 哈哈,这整个时间我一直以为这是一个C++问题...看来我正在失去理智。:p - obataku

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不是一个常量,那么一个好的编译器可以(也应该)静态分配这两个数组,从而产生更高效的代码。


这似乎与@veer的答案类似,只是const在行上的位置不同。那有什么区别吗? - johnbakers
@andrewx,是的和不是的,注意第二个中有更多的“const”。这些“const”的放置很重要,它们表示不同的含义。最容易看到的是,这里的“const”适用于左侧的内容。在我的第一个版本中,只有指针受到保护,而不是数组的内容。在第二个版本中,它们都受到保护。 - Jens Gustedt
此外,使用复合字面量可以避免您的数组被其他方式访问,因为它们没有名称可供引用。这也确保编译器可以进行某些优化。 - Jens Gustedt

0
你需要做类似这样的事情:
if(red) {
    colours[0] = 1;
    colours[1] = 0.5;
    colours[2] = 0.5;
    ...
    colours[7] = 1;
} else {
    ...
}

这是什么语法(除了英式拼写颜色)?突然间你把它变成了一个函数? - Jens Gustedt
我认为他指的是方括号,而不是圆括号。这位用户应该编辑他的回答以澄清。 - johnbakers
抱歉,你是完全正确的。这是一个给所有人的教训:被迫使用VB6编程会带来有害影响的警示。你会忘记真正的编程语言是什么样子的。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接