2015-09-25 4 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] 

Будет ли создать массив размера один, которым первый элемент, который вы можете затем доступ через р [0].

Для решения вашей проблемы либо вы хотите использовать std :: vector, чтобы быть массивом, который может изменить размер, или вы хотите создать массив «достаточно большой» в начале. Вы не можете изменить размер стандартного массива. Кроме того, чтобы избежать вызова main, вы можете использовать цикл while с условием (pick! = 4).

1

Я предполагаю, что вы хотите запустить цикл, в котором вы обрабатываете команды. Но вы должны вызывать main() рекурсивно после каждой команды. Каждый вызов функции main() создает собственный экземпляр массива друзей, который является свежим и пустым. Таким образом, когда вы добавляете друга, а затем печатаете его, вы на самом деле печатаете другой (и пустой) массив.

Это не хорошо по нескольким причинам:

  1. Это не работает, см выше
  2. Даже если вы получили его на работу, было бы утечка памяти и в конечном итоге крах.

Предлагаю вам установить оператор switch внутри цикла и заменить вызовы main() внутри коммутатора инструкциями break.

+0

Обратите внимание, что стандарт фактически запрещает использование 'main' внутри программы. – TartanLlama

Смежные вопросы