2015-09-25 89 views
0

我想将任意数组的结构传递给函数。它编译得很好,但它没有打印任何内容。 这里是结构的任意阵列: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(); 
    } 
} 
+3

'index'在开始时是'0',所以'p_array'将是空的。改用'std :: vector'。 – TartanLlama

+0

如果这是一个学校作业,并且您必须使用指针,则您需要分配'p_array'来从头开始包含足够的条目,或者每次添加条目时重新分配它。 –

+0

您的数组元素从未初始化.. – amdixon

回答

1

这种方法对您的代码有多种问题。实际上你很想直接做什么,所以我理解你的困惑。然而,主要问题是存储的朋友阵列被重新分配,每次主()被调用:

aFriend *p_array=new aFriend[index]; 

这意味着,它实际上是重置每次它被称为时间,这似乎并不成为你想要的,因为你想保持你的旧注册朋友。变量索引在开始时初始化为零 - 数组为,索引为,从零开始,但是按您想要的大小初始化。那就是:

aFriend *p = new aFriend[1] 

将创建大小一个的阵列,其中,第一元件可以然后用p访问[0]。

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

1

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

这是不好的原因有几个:

  1. 它不工作,见上
  2. 即使你得到它的工作,这将导致内存泄漏,并最终崩溃。

我建议你把switch语句放在一个循环中,并用break语句替换switch中的main()调用。

+0

请注意,标准实际上在程序中使用'main'取代。 – TartanLlama

相关问题