Cyp*_*106 3 c c++ arrays struct declaration
这是一个如此愚蠢的问题,甚至要求它令人沮丧.拜托我,我今天对这一个感到特别愚蠢....
我有一个带有某个typedef结构的库.基本上:
typedef struct {int x; int y;} coords;
Run Code Online (Sandbox Code Playgroud)
我真正想做的是在我的标题中声明一个变量数组:
coords MyCoords[];
Run Code Online (Sandbox Code Playgroud)
(我最近把它切换到了coords *MyCoords;然后跑了一个MyCoords = new coords[4];)
然后在我的初始化中我想对其中的一些值进行硬编码.
MyCoords[] = {{0, 0}, {2, 2} etc.
Run Code Online (Sandbox Code Playgroud)
我今天必须只是在脑力激荡,因为它不会让我做任何简单地放入简单的东西的方式 MyCoords[0] = {0, 0}
抱歉上面的一些语法.谢谢你的帮助.我甚至不关心一次对所有值进行硬编码.我现在很好,只是MyCoords[0] = {0, 0}工作.我能做到,MyCoords[0].x = 0; MyCoords[0].y = 0但我永远不知道我做错了什么.非常感谢任何人..
您只能在声明它的同一位置初始化数组.将起作用的形式是:
coords MyCoords[] = {{0, 0}, {2, 2}};
Run Code Online (Sandbox Code Playgroud)
如果你需要在标题中声明MyCoords以便许多模块可以访问它,我认为以下内容将起作用:
extern coords MyCoords[];
Run Code Online (Sandbox Code Playgroud)
那么,你创建的不是变量数组.这是一个大小未知的数组.该数组具有不完整的类型,因此无法在C++中定义.你可以做的就是把它作为一个声明,放在extern它之前.
extern coords MyCoords[];
Run Code Online (Sandbox Code Playgroud)
然后,在初始化它的.cpp文件中,您可以创建(定义)该数组 - 当然,您应该在命名空间范围内,在任何函数之外执行它,当然:
coords MyCoords[] = {{1, 2}, {3, 4}, ... };
Run Code Online (Sandbox Code Playgroud)
如果你想要的是一个数组,其大小在编译时尚未知,而是在运行时,你应该使用std::vector:
std::vector< coords > MyCoords;
Run Code Online (Sandbox Code Playgroud)
然后如果你填写它,做
MyCoords.push_back( coords(1, 2) );
MyCoords.push_back( coords(3, 4) );
....
Run Code Online (Sandbox Code Playgroud)
或者创建一个本地数组,然后使用该数组元素的副本初始化该向量:
coords c[] = ....;
MyCoords.insert(MyCoords.end(), c, c + sizeof c / sizeof *c);
Run Code Online (Sandbox Code Playgroud)
好吧,在C中,它与C++略有不同.您可以定义其维度未知的数组.会发生什么,它被认为是一个"暂定"的定义.如果在文件的末尾(更确切地说,它的翻译单元,即该文件,以及它包含的所有文件 - 意味着编译器一起翻译的所有文件),则没有包含大小的后续定义,那么尺寸被认为是1.但是,在C++中没有暂定定义,并且定义不包含大小,并且不包含可以告诉大小的初始化程序是无效的C++程序.
由于你的代码变得粗俗,你正在做
MyCoords[0] = {0, 0}
Run Code Online (Sandbox Code Playgroud)
编译器将读作哪个:
-> Set LHS to RHS
-> -> LHS is a variable of type `coords`. Fine
-> -> RHS is... hmm, `{0, 0}`. What the heck is it??
Run Code Online (Sandbox Code Playgroud)
你看,编译器不知道右侧应该是什么意思.因此,C99(1999版C)引入了所谓的复合文字.它允许你写
MyCoords[0] = (coords){0, 0};
Run Code Online (Sandbox Code Playgroud)
它实际上会按照您的要求进行操作 - 创建类型的右侧值coord并将其分配到左侧.但是你应该只是因为兼容性原因(许多C编译器不合理C99兼容 - 而C++和C89都不支持复合文字),请使用我之前向您展示的方法之一.
| 归档时间: |
|
| 查看次数: |
8882 次 |
| 最近记录: |