2016-05-24 1 views
-3

コードを実行しようとすると、最初の入力が要求されますが、次にコアにダンプされたことが示されます。プログラムを実行すると、コアがダンプされる

私はいくつかの疑問がありますが、どうすればそのような警告を修正できますか? Dこれらと

コンパイル:

グラム++ -O2 -Wall -o Proy2.cpp Proy2

そして、このコードを最適化できるなら、私に教えてくださいしてくださいは、I`mは 効率的なコードを作成しよう

コード:

#include <cstdio> 

#include <iostream> 

using namespace std; 

int main(){ 

    typedef struct PC{ 

    char Brand[20]; 
    char Model[20]; 
    char Serial[20]; 
    char Processor[10]; 

    }; 

    PC PC1[5],*machine; 

    unsigned int i; 

    for(i = 0; i < 4; i++){ 

    cout <<"Insert PC brand: "; 
     fgets(machine->Brand, 20, stdin); fflush(stdin); 

    cout <<"Insert PC model: "; 
     fgets(machine->Model, 20, stdin); fflush(stdin); 

    cout <<"Insert PC serial: "; 
     fgets(machine->Serial, 20, stdin); fflush(stdin); 

    cout <<"Insert PC processor: "; 
     fgets(machine->Processor, 10, stdin); fflush(stdin); 

    printf("PC Brand : %s", PC1[i].Brand); 
    printf("PC Model : %s", PC1[i].Model); 
    printf("PC Serial : %s", PC1[i].Serial); 
    printf("PC Processor: %s", PC1[i].Processor); 

    PC1[i] = *machine; 

    } 

    return 0; 
} 
+3

あなたの 'machine'変数は決して初期化されません。もしそれが修正されれば、それを本格的な答えにしてください:) – saloomi2012

+1

"コアはコンパイルしようとしました " - あなたは*コンパイラがクラッシュしたと言っているようです?それは珍しいことです(しかし、聞いたことはありません)。 – immibis

+1

CまたはC++を使用するかどうかを決めてください。 'fgets'は' getline'で、 'fflush(stdin):'は不正です。もちろん、直面する問題を解決するには 'machine = new PC; 'が必要です。 –

答えて

1

cout C++、printfもC、およびshoul C. fgetsですされていますdはgetline(C++)です。両方を混ぜるのではなく、言語を選択する必要があります。 Char*はCであるとstringは、あなたのクラスまたは構造体があなたのメイン

あなたは PC1[5]を使用し、ループの中であなただけの4つの要素(3から0は、4つの要素である)を与えている
#include <cstdio> 

#include <iostream> 

using namespace std; 

typedef struct PC{ 

    string Brand; 
    string Model; 
    string Serial; 
    string Processor; 

}; 

int main(){ 

    PC *PC1[5]; // pointer of pointers 
    PC *machine=new PC[4]; 

    unsigned int i; 

    for(i = 0; i < 4; i++){ 

     cout <<"Insert PC brand: "; 
     cin >> machine->Brand; 

     cout <<"Insert PC model: "; 
     cin >> machine->Model; 

     cout <<"Insert PC serial: "; 
     cin >> machine->Serial; 

     cout <<"Insert PC processor: "; 
     cin >> machine->Processor; 

     PC1[i] = machine; // you store the machine in PC1 

     cout << "PC Brand : " << PC1[i]->Brand << endl; 
     cout << "PC Model : " <<PC1[i]->Model << endl; 
     cout << "PC Serial : " <<PC1[i]->Serial << endl; 
     cout << "PC Processor: " <<PC1[i]->Processor << endl; 

    } 

    return 0; 
} 

にすべきではないC++

です。私は、あなたは二つの変数

PC PC1 [5]、*マシンを定義

+0

配列を 'std :: vector'に置き換えてください。答えがより鮮明になります。 –

+0

Bit89はCやC++をよく知らないようですが、まだベクトルの準備が整っていません – Hearner

+0

ベクトルを知っていますが、私の考えでは単純な配列のほうが性能が良いと私には間違っていると教えてください – Bit89

1

あなたのループ変更したいもの。

手段

PC1は、サイズ5の配列で、各要素は、PC(それぞれが既にデフォルトのctorで初期化される)

マシンPCにptrをされ、初期化されていないとあなたが次に

を割り当てられていません機械

関数fgets(機械>ブランド、20、STDIN)に格納

と機械がuninitialiであるように、コア・ダンプを取得しています

をZEDおそらくあなたは= & PC1 [i]は何も

マシンを割り当てる前に、以下のループ内のような機械

を初期化することである今 をソリューションを推測しています。

printf("PC Brand : %s", PC1[i].Brand); 

と、次の行に:それはあなたが初期化されていない変数を印刷ここで自動的にtypedefを-ED

0

であるとして、あなたは、構造体/クラスを定義する際に、typedefのは、C++で必要とされていないところで

PC1[i]にデータを書き込んだことはありません。代わりに、newのdというデータにデータを書き込んで、machineを指していました。

PC1[i] = *machine; 

私はその行がprintfライン前であるためにあなたが意味を推測:

は、後で上のラインを持っています。

ダイナミックアロケーションを使用する必要はありません。代わりにPC machine;と書くことができます。実際にはに直接machineがなくても読むことができます。

関連する問題