繁体   English   中英

如何将结构的任意数组传递给函数?

[英]how to pass arbitrary array of structs to a function?

我试图将结构的任意数组传递给函数。 它编译良好,但不打印任何内容。 这是任意的结构数组: aFriend *p_array=new aFriend[index]; 该函数调用updateTalk(p_array, index); 和功能void updateTalk(aFriend an_array[], int a_size)

这也是整个代码:

#include <iostream>

using namespace std;

struct aFriend
{
    string name;
    int days_ago=0;
};

aFriend addFriend(int& index)
{
    aFriend newFriend;
    cout<<"Enter friend's name:\t";
    cin>>newFriend.name;
    do{
    cout<<"How many days ago you talked with him/her:\t";
    cin>>newFriend.days_ago;
    } while (newFriend.days_ago<=0);
    index++;
    return newFriend;
}

void updateTalk(aFriend an_array[], int a_size)
{
    cout<<"an_array[0].name="<<an_array[0].name<<endl;
    cout<<"Select one of the following names:\n";
    for(int i=0;i<a_size;i++)
    {
        cout<<"1. "<<an_array[i].name;
    }
    cout<<endl;
}

void printList()
{

}
int index=0;
int main()
{
    cout<<"1. Add friend\n2. Update last talk\n3. Print list\n4. Exit\n";
    int pick;
    cin>>pick;
    aFriend *p_array=new aFriend[index];
    switch (pick)
    {
        case 1: addFriend(index);return main();
        case 2: updateTalk(p_array, index); return main();
        case 3: printList(); return main();
        case 4: return 0;
        default: cout<<"Error! Please select one of the available options!\n"; return main();
    }
}

我假设您想运行一个循环来处理命令。 但是您要做的是在每个命令之后递归调用main()。 每个main()调用都会创建自己的friends数组实例,该实例是新鲜的并且是空的。 因此,当您添加一个朋友然后打印它时,您实际上是在打印另一个(空的)数组。

由于以下几个原因,这样做不好:

  1. 它不起作用,请参见上文
  2. 即使您可以使用它,它也会泄漏内存并最终崩溃。

我建议您将switch语句放在循环内,并用break语句替换switch内部的main()调用。

这种方法对您的代码有多个问题。 实际上,您要执行的操作非常直观,因此我理解您的困惑。 但是, 主要问题是每次调用main()时都会重新分配存储朋友的数组:

aFriend *p_array=new aFriend[index];

这意味着实际上每次调用它时都会重置它,这似乎不是您想要的,因为您想保留您的旧注册朋友。 变量索引在开始时被初始化为零-数组从零开始索引 ,但通过所需的大小进行初始化。 那是:

aFriend *p = new aFriend[1]

将创建一个大小为 1的数组,然后您可以通过p [0]访问第一个元素。

为了解决您的问题,您要么要使用std :: vector作为可以更改大小的数组,要么要在开始时创建“足够大”的数组。 您不能调整标准数组的大小。 同样,为了避免调用main,可以使用while循环,条件是(选择!= 4)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM