0

なぜ私が得ているのか理解していないようです:

Segmentation fault (core dumped)

私の「映画」を映画構造体に入力するとき。ここに明らかな論理エラーがありますか?

セグメンテーション違反に加えて、void set_movies() 内の for ループは、#define NUM_MOVIES 5 のために 5 を返す必要があるときに、映画の 4 つのプロンプトしか返していないようです。

ありがとうございます!

#include <iostream>
#include <string>
#include <sstream>

#define NUM_MOVIES 5

using namespace std;

struct movie{
   string name[];
   double copies[];
   double rating[];
   string description[];
   string genre[];
} films [NUM_MOVIES];

void set_movies();
int which_movies_to_view();
int get_movies();
int rent_movie();
int printmovie();
int choice;

int main(){
    set_movies();
    which_movies_to_view();
    get_movies();
    rent_movie();

    return 0;
}

void set_movies(){
    movie set;

    for(int i=0; i<NUM_MOVIES; i++){
        cout << "Enter movie title: " << endl;
        cin >> set.name[i];
        cout << "Enter how many copies: " << endl;
        cin >> set.copies[i];
        cout << "Enter the rating: " << endl;
        cin >> set.rating[i];
        cout << "Enter a description: " << endl;
        cin >> set.description[i];
        cout << "Enter the genre: " << endl;
        cin >> set.genre[i];
    }
}

int which_movies_to_view(){
    movie set;

    cout << "  " << set.name[1] << set.name[2] << set.name[3] << set.name[4] << set.name[5] << endl;
    cout << "Which movie would you like to view?: [1, 2, 3, 4, or 5]" << endl;
    cin >> choice;

    return choice;
}

int get_movies(){

    movie set;

    if(choice == 1){
       cout << set.name[1] << endl;
    }
    if(choice == 2){
       cout << set.name[2] << endl;
    }
    if(choice == 3){
       cout << set.name[3] << endl;
    }
    if(choice == 4){
       cout << set.name[4] << endl;
    }
    if(choice == 5){
       cout << set.name[5] << endl;
    }

    return 0;
}

int printmovie(){

    int n;
    for(int n = 0; n<NUM_MOVIES; n++)
    cout << films[n].name;
    cout << films[n].copies;
    cout << films[n].rating;
    cout << films[n].description;
    cout << films[n].genre;

    return 0;
}

int rent_movie(){
    movie set;

    if(choice == 1){
            set.copies[0] - 1;
            cout << set.copies[0] << " copies left!" << endl;
    }
    if(choice == 2){
            set.copies[1] - 1;
            cout << set.copies[1] << " copies left!" << endl;
    }
    if(choice == 3){
            set.copies[2] - 1;
            cout << set.copies[2] << " copies left!" << endl;
    }
    if(choice == 4){
            set.copies[3] - 1;
            cout << set.copies[3] << " copies left!" << endl;
    }
    if(choice == 5){
            set.copies[4] - 1;
            cout << set.copies[4] << " copies left!" << endl;
    }

    return 0;
}
4

5 に答える 5

6

構造体のメンバーを空の配列として宣言しているだけでなく、それらの構造体の配列も宣言しています。

私はあなたが実際にこれを望んでいると思います:

struct movie{
   string name;
   double copies;
   double rating;
   string description;
   string genre;
} films [NUM_MOVIES];

そして、、などを使用しfilms[i].movieますfilms[i].copies

于 2013-03-14T01:04:38.437 に答える
4

「文字列名[];」これは空の配列を定義し、「set.name [i]」に書き込むと、コアダンプが発生します。だから、構造体映画の他のメンバーに。

実際には、gdbを使用してコアファイルを読み取ることができます。これにより、コアダンプが発生した場所がわかります。

于 2013-03-14T01:03:10.100 に答える
1

あなたstructはこれを見ることができます:

struct Movie
{
   std::string name;
   unsigned int copies;
   double rating;
   std::string description;
   std::string genre;
};

また、C ++を使用していて、サイズが柔軟な映画のリストになりたい場合はstd::vector、Cスタイルの配列の代わりに使用する必要があります。

std::vector<Movie> movies;

vector次に、そのpush_back方法を使用して、これに新しい映画を追加するだけです。

Movie m;
// set m's data members here
movies.push_back(m);

そして、後でこれらの映画にアクセスしたいときは、配列のように扱うことができます。

for (int i = 0; i < movies.size(); ++i)
    std::cout << movies[i].name << std::endl;
于 2013-03-14T01:21:36.940 に答える
1

データ構造を正しく使用した唯一の関数はですprintmovie()。あなたがのようなものを使う他のどこでもset.name[i]間違っています。さらに、[]構造体内の定義からを削除する必要があります。そうでなければ、それらはポインタ型として扱われると私は信じています。

于 2013-03-14T01:04:10.893 に答える
0

これは、ムービー構造体で配列のサイズを宣言していないためです。C ++はCから多くの機能を継承していることを忘れないでください。Cは、各関数の開始時に割り当てるメモリの数を宣言するように強制します。

于 2013-03-14T01:15:17.920 に答える