2017-02-01 24 views
0

私は映画情報をユーザーに求めるプログラムを書こうとしています。構造体としてのムービーの情報をベクタに格納し、結果を画面に出力します。この2つの関数の戻り値の型はvoidです。このポインタ/メモリの問題を解決するにはどうすればよいですか?

#include <iostream> 
#include <iomanip> 
#include <vector> 
#include <string> 
using namespace std; 

void make_movie(struct movie *film); 
void show_movie(vector <movie> data, int cnt); 

struct movie { 
    string name; 
    string director; 
    int year; 
    int duration; 
}; 

int main() { 

    int count = 0; 
    char input; 
    vector <movie> record; 
    movie *entry = nullptr; 

    do { 

     make_movie(entry); 
     record.push_back(*entry); 
     count++; 

     cout << endl; 
     cout << "Do you have more movie info to enter?\n"; 
     cout << "Enter y/Y for yes or n/N for no: "; 
     cin.ignore(); 
     cin >> input; 
     cout << endl; 


    } while (input == 'y' || input == 'Y'); 

    show_movie(record, record.size()); 

    return 0; 
} 

void make_movie(struct movie *film) { 

    cout << "Enter the title of the movie: "; 
    cin.ignore(); 
    getline(cin, film -> name); 

    cout << "Enter the director's name: "; 
    cin.ignore(); 
    getline(cin, film -> director); 

    cout << "Enter the year the movie was created: "; 
    cin >> film -> year; 

    cout << "Enter the movie length (in minutes): "; 
    cin >> film -> duration; 

} 

void show_movie(vector <movie> data, int cnt) { 

    cout << "Here is the info that you entered: " << endl; 

    for (int i = 0; i < cnt; i++) { 

     cout << "Movie Title: " << data[i].name << endl; 
     cout << "Movie Director: " << data[i].director << endl; 
     cout << "Movie Year: " << data[i].year << endl; 
     cout << "Movie Length: " << data[i].duration << endl; 
     cout << endl; 
    } 
} 

禁止されたメモリアドレスにアクセスしようとしているというエラーが表示されます。

+0

'make_movie'は、ポインタを使用しないで、値で映画を返す必要があります –

答えて

1

あなたが作るために必要な変更の最低額は変更することです:

movie *entry = nullptr; 

do { 
    make_movie(entry); 
    record.push_back(*entry); 

へ:

movie entry; 

do { 
    make_movie(&entry); 
    record.push_back(entry); 

さらなる改良は次のようになります。

  • 変更make_movieによってパラメータを受け入れるようにあなたのプログラムはポインタを使用しないので、問題のいずれかに脆弱ではありませんポインターで目立つ。
  • make_movieを、参照パラメータを取る代わりに値で返すように変更します。
  • cin.ignore();が間違って使用されています。あなたのプログラムは、いくつかの入力文字列の最初の文字を失います。代わりに、これらの呼び出しをすべて削除し、make_movie関数の最後に、現在の行の残りの部分を無視します。また、cin >> input;getlineに変更してください。
0

バグ
movie *entry = nullptr;


あなたが持っている余分な修正方法

cout << "Enter the title of the movie: "; 
// cin.ignore(); 
    getline(cin, film -> name); 

    cout << "Enter the director's name: "; 
// cin.ignore(); 
    getline(cin, film -> director); 

cin.ignore();

movie main_info; 
movie* entry = &main_info; 

テスト

intput:

Enter the title of the movie: any_thing 
Enter the director's name: yourself 
Enter the year the movie was created: 2016 
Enter the movie length (in minutes): 120 

Do you have more movie info to enter? 
Enter y/Y for yes or n/N for no: n 

出力

Here is the info that you entered: 
Movie Title: any_thing 
Movie Director: yourself 
Movie Year: 2016 
Movie Length: 120 
関連する問題