我是结构编程的新手,我发现在尝试在c ++中传递数组结构时非常困惑。我有一个为大学做的项目,一个星际迷航游戏。这是示例代码:
void main_menu(char,char [][sz2],int&,struct enterpriseSt*,struct klingonSt*[100]);
void combat_menu(char [][sz2],struct enterpriseSt*,int&,struct klingonSt*[100]);
struct enterpriseSt
{
int energy_level;
int damage;
int torpedo_count;
};
struct klingonSt
{
int energy_level;
int damage;
int position[2];
};
int main()
{
struct enterpriseSt enterprise;
enterprise.energy_level=energy_ent_max;
enterprise.damage=0;
enterprise.torpedo_count=10;
struct klingonSt klingon[100];
main_menu(command,galaxy,turn,&enterprise,&klingon);
return 0;
}
void main_menu(char command, char galaxy[][sz2],int& turn,struct enterpriseSt * enterprise,struct klingonSt * klingon[100])
{
combat_menu(galaxy,enterprise,turn,klingon);
}
我有两个结构,enterpriseSt和klingonSt。我可以通过企业没问题,但克林顿我正在努力。我得到各种错误,无论我使用什么组合都没关系。目前的是:
error: cannot convert ‘klingonSt (*)[100]’ to ‘klingonSt**’ for argument ‘5’ to ‘void main_menu(char, char (*)[64], int&, enterpriseSt*, klingonSt**)’
我现在搞得这么乱。有人可以向我解释为什么它与企业合作但不与克林贡合作? 我在Ubuntu上使用g ++编译器。感谢。
答案 0 :(得分:1)
我认为你在将数组传递给函数时有点困惑。完成此操作后,数组将衰减为指向数组第一个元素的指针。您可以将参数声明为数组,但编译器会忽略该数组范围,而不会在运行时强制执行。因此,对于这种编码风格,您只想将数组作为指针传递,并将长度作为单独的参数传递(为清楚起见,我省略了其他参数):
void main_menu(enterpriseSt*, int enterpriseCount, klingonSt*, int klingonCount);
需要考虑的其他选择:
采用现代C ++风格,并使用像vector / list这样的标准容器,通过引用传递它们。
void main_menu(vector<enterpriseSt> & enterprises, vector<klingonSt> & klingons);
或者,使用模板包装器隐式传递大小的本地数组:
template<size_t eCount, size_t kCount>
void main_menu(enterpriseSt (&enterprises)[eCount], klingonSt (&klingons)[kCount])
{
main_menu(enterprises, eCount, klingons, kCount);
}
答案 1 :(得分:1)
您的问题是误解了解析规则的参数。
你认为struct klingonSt*[100]
是指向struct klingonSt 类型的大小为100的数组的指针,但实际上当参数解析时,数组和函数符号应位于右侧令牌的优先级高于表达式左侧的符号。
因此,让我们首先编写包含参数名称的表达式:
struct klingonSt*var[100]
并解析它
所以,struct klingonSt*var[100]
实际上是指向struct klingonSt 的指针大小为100的数组。
传递指向struct klingonSt 类型的大小为100的数组的指针,您应该使用括号更改解析优先级:
struct klingonSt(*var)[100]
或
struct klingonSt(*)[100]
如果您更改定义,您的代码将编译正常。
答案 2 :(得分:0)
问题
struct klingonSt * klingon[100]
是一个100 struct klingonSt *
的数组,而不是指向100 struct klingonSt
改为使用struct klingonSt klingon[][100]
。