Objective c 为C数组赋值

Objective c 为C数组赋值,objective-c,c,Objective C,C,我可以像这样初始化一个C数组: CGFloat colors[8]= {1,0.5,0.5, 1, 0.5,0.2,0.2, 1}; 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 如果我想定义颜色[8]但有条件地分配8个值,该怎么办。这可能吗?如果是,我找不到正确的语法。大概是这样的: CGFloat c

我可以像这样初始化一个C数组:

CGFloat colors[8]= {1,0.5,0.5, 1,
    0.5,0.2,0.2, 1};
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
如果我想定义
颜色[8]
但有条件地分配8个值,该怎么办。这可能吗?如果是,我找不到正确的语法。大概是这样的:

CGFloat colors[8]= {1,0.5,0.5, 1,
    0.5,0.2,0.2, 1};
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

我尝试过各种语法,但都不管用。我猜这是不可能的?

这将不起作用,因为这种分配方式只允许在数组初始化时使用。您可以做的是:

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

你需要像这样做

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

试试下面的方法,也许

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;
如果您需要原始数据的副本(即,您计划对
颜色进行变异
,但重复使用
颜色(红色)
颜色(其他)
),则应使用(在中声明):


如果您有最新的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 */ };
观察
*
后面的
常量
,这样指针就不会被修改,但数据会被修改。如果
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
不是常数的情况下产生更有效的结果。

您的第三行代码上的星号(*)是一个输入错误吗?CGFloat不是对象。@andrewx否,我声明了
colors
作为指向
const CGFloat
的指针。我假设
memcpy
是必需的,您不能只将一个数组设置为另一个数组?您可以将指针指定给数组,只要您不打算变异
颜色
并重用
红色
其他颜色
。如果你希望重用它们,并且改变<代码>颜色< /C>,你需要复制一个拷贝,因此<代码> STD::MeMpPy < /C> > .VEER -这不是C++,不需要<代码> STD::/Cord>我假设MeMCPY是必需的,并且你不能只设置一个数组等于另一个数组。只有当数组被等效的
struct
/
union
类型包装时,才会发生复制数组的赋值。因此,如果我的两个数组都是
CGFloat
我应该能够在不使用
memcpy
的情况下将一个数组赋值给另一个数组,因为它们都是相同的结构?
struct Foo{float arr[3];};结构fooa={{1,2,3};结构Foo b=a
@user315052作为旁白,您可能不应该创建这样的结构来复制数组,而应该使用
memcpy
。这是什么语法(除了英国的颜色拼写)?你突然把它变成了一个函数?我相信他指的是括号,不是括号。此用户应编辑其答案以进行澄清。对不起,您完全正确。这是给所有人的一堂实物课:一个关于被迫在VB6中编程的有害影响的警告。你忘记了真正的编程语言是什么样子了。这似乎与@veer的答案相似,只是
常量
在行中的不同位置。这有区别吗?@andrewx,是和否,观察到在第二个例子中有更多的
const
。这些常量的位置很重要,它们的含义不同。这里最容易看到的是
const
适用于左边的内容。在我的第一个版本中,只保护指针不被修改,而不保护数组的内容。在第二种情况下,它们都是受保护的。此外,使用复合文字避免了通过其他方式访问数组,因为它们没有您可以引用的名称。这还确保编译器可以完成某些优化。