0

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

4

3 回答 3

1

您的问题在于误解了参数解析规则。

您认为这struct klingonSt*[100]一个指向 struct klingonSt 类型的大小为 100 的数组的指针,但实际上在参数解析时,应该位于令牌右侧的数组和函数符号比表达式左侧的符号具有更高的优先级。

因此,让我们首先编写包含参数名称的表达式:

struct klingonSt*var[100]

并解析它

  1. 变量
  2. 是一个大小为 100 的数组(因为右边的数组符号比左边的指针具有更高的优先级)
  3. 指针
  4. 到类型结构 klingonSt

因此,struct klingonSt*var[100]实际上是大小为 100 的指向 struct klingonSt 的指针数组

要将指针传递给 struct klingonSt 类型的大小为 100 的数组,您应该使用括号更改解析优先级:

struct klingonSt(*var)[100] 

或者

struct klingonSt(*)[100] 

如果您更改定义,您的代码将编译得很好。

于 2013-06-08T16:19:19.450 回答
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);
}
于 2013-06-08T16:13:00.180 回答
0

那个问题

struct klingonSt * klingon[100]

是 100 的数组,struct klingonSt *而不是指向 100 的点struct klingonSt

改为使用struct klingonSt klingon[][100]

于 2013-06-08T16:19:31.453 回答