将数组结构作为参考c ++传递

时间:2013-06-08 15:56:24

标签: c++ arrays struct structure

我是结构编程的新手,我发现在尝试在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 ++编译器。感谢。

3 个答案:

答案 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]

并解析它

  1. VAR
  2. 是一个大小为100的数组(右边的数组符号优先级高于左边的指针)
  3. 指针
  4. 到struct klingonSt
  5. 类型

    所以,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]