如何将任意结构数组传递给函数?
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 数组实例,该实例是新鲜的空的。因此,当你添加一个朋友然后打印它时,你实际上打印了一个不同的(并且是空的)数组。
这不好有几个原因:
- 无效,见上文
- 即使你让它工作,它也会泄漏内存并最终崩溃。
我建议您将 switch 语句放在一个循环中,并将 switch 中的 main() 调用替换为 break 语句。
您的代码的这种方法存在多个问题。您尝试做的事情实际上非常直观,所以我理解您的困惑。但是,main 问题是每次调用 main() 时都会重新分配存储朋友的数组:
aFriend *p_array=new aFriend[index];
这意味着每次调用它实际上都会被重置,这似乎不是你想要的,因为你想保留你的旧注册朋友。变量索引在开始时被初始化为零——数组是从零开始索引,但初始化为你想要的大小。即:
aFriend *p = new aFriend[1]
将创建一个大小的数组,然后您可以通过p[0]访问第一个元素。
为了解决你的问题,要么你想使用 std::vector 作为一个可以改变大小的数组,要么你想在开始时创建 "big enough" 数组。您不能调整标准数组的大小。同样,为了避免调用 main,您可以使用 while 循环,条件是 (pick != 4).
我正在尝试将任意结构数组传递给函数。它编译得很好,但什么也不打印。
这是任意结构数组: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 数组实例,该实例是新鲜的空的。因此,当你添加一个朋友然后打印它时,你实际上打印了一个不同的(并且是空的)数组。
这不好有几个原因:
- 无效,见上文
- 即使你让它工作,它也会泄漏内存并最终崩溃。
我建议您将 switch 语句放在一个循环中,并将 switch 中的 main() 调用替换为 break 语句。
您的代码的这种方法存在多个问题。您尝试做的事情实际上非常直观,所以我理解您的困惑。但是,main 问题是每次调用 main() 时都会重新分配存储朋友的数组:
aFriend *p_array=new aFriend[index];
这意味着每次调用它实际上都会被重置,这似乎不是你想要的,因为你想保留你的旧注册朋友。变量索引在开始时被初始化为零——数组是从零开始索引,但初始化为你想要的大小。即:
aFriend *p = new aFriend[1]
将创建一个大小的数组,然后您可以通过p[0]访问第一个元素。
为了解决你的问题,要么你想使用 std::vector 作为一个可以改变大小的数组,要么你想在开始时创建 "big enough" 数组。您不能调整标准数组的大小。同样,为了避免调用 main,您可以使用 while 循环,条件是 (pick != 4).