2015-09-25 87 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

相關問題