2

我想将 C 风格的结构添加到 C++ 标头并在 C 函数中使用它。但这不起作用:

struct Vertex {
float Position[2];
float Color[4];
};

struct Square{
Vertex vertices[4];
};

别处:

float color[4]={rColor, gColor, bColor, alpha};
float halfsize=(float)size/2;

Square square= {
    {{halfsize,halfsize},{color[0],color[1],color[2],color[3]}},
    {{halfsize,-halfsize},{color[0],color[1],color[2],color[3]}}, //error on this line
    {{-halfsize,-halfsize},{color[0],color[1],color[2],color[3]}},
    {{-halfsize,halfsize},{color[0],color[1],color[2],color[3]}}
};

在第二行报告“结构初始化程序中的多余元素”。

在相关说明中,是否有更有效的方法将数组传递colorsquare集合?

4

2 回答 2

6

您需要为初始化程序添加一个额外的大括号Vertex vertices[4];

                \/   
Square square= {{
    {{halfsize,halfsize},{color[0],color[1],color[2],color[3]}},
    {{halfsize,-halfsize},{color[0],color[1],color[2],color[3]}}, //error on this line
    {{-halfsize,-halfsize},{color[0],color[1],color[2],color[3]}},
    {{-halfsize,halfsize},{color[0],color[1],color[2],color[3]}}
}};
^
于 2013-01-10T09:35:27.417 回答
2

正如其他回答者所提到的,您应该添加一个额外的大括号,然后事情就会起作用。

但是,您还会问这是否是一种更有效的传入方式color

恐怕我认为没有。由于 C 和 C++ 都不会跟踪数组的长度,并且由于没有用于拼接数组的构造,因此您无法向编译器指示您希望复制数组的某个部分。

但是你所说的高效到底是什么意思?如果您的意思是,“有没有一种执行速度更快的方法?” 那么答案几乎肯定是否定的。此初始化将非常快。

如果你的意思是,“有没有一种方法可以用更少的代码来编写?” 那么答案很可能是否定的。六行很紧。

Granted, you are using a C++ header, so I'd think you must also be using a C++ compiler so it seems pointless to build this part of the code in pure C. You could make color into an STL vector and then build some constructors for Square and Vertex which initialize off of this vector. It would not take significantly more code and may reduce the probability of accidental mistakes.

Alternatively, if you're set on C and plan on having this code come up time and again, you could consider using a macro (either as below, or for the whole bloody thing, but then I'd say it would be better to have it in a function):

#define RGB_INIT {color[0],color[1],color[2],color[3]}

Though macros do have their dangers.

于 2013-01-10T10:08:05.430 回答