2017-07-07 21 views
0

私のコードは動作していません。私は-fpermissiveのエラーがあります(「は「int」から「persona *」[-fpermessive]に変換されません)。 私を助けることができますか?これは私の最初の本当のプログラムです、エラーと悪い英語のために申し訳ありません。C++の構造体ポインタ

#include <iostream> 

using namespace std; 

struct persona 
{ 
    char nome[20]; 
    unsigned int eta; 
    unsigned int altezza; 
    unsigned int peso; 
}; 

int totale = 0; 
struct persona prs[100]; 

void leggere_dati(persona* prs) 
{ 
    cout << "Persona numero: " << (totale + 1) << endl; 
    cout << "Nome: " << prs->nome << endl; 
    cout << "Eta': " << prs->eta << endl; 
    cout << "Altezza: " << prs->altezza << endl; 
    cout << "Peso: " << prs->peso << endl; 
    cout << "-----------------------------------------------\n"; 
} 

void inserire_dati(persona* prs) 
{ 
    cout << "Nome? "; 
    cin >> prs -> nome; 
    cout << "\nEta'? "; 
    cin >> prs -> eta; 
    cout << "\nAltezza? "; 
    cin >> prs -> altezza; 
    cout << "\nPeso? "; 
    cin >> prs -> peso; 
} 

int main() 
{ 
    int risposte = 0; 
    char risp = 0; 

     do{ 
     inserire_dati(totale); 
     cout << "Inserire un'altra persona? (S/N)" << endl; 
     cin >> risp; 
     if (risp == 'S') 
    { 
     risposte += 1; 
     totale++; 
     continue; 
    } 
    } while (risp == 's' || risp == 'S'); 

    if (risp == 'n' || risp == 'N') 
    { 
     for (totale = 0; totale <= risposte; totale++) 
      leggere_dati(totale); 
    } 
} 
+0

変数 'totale'はどのような型ですか?それを関数 'inserire_dati'の引数として渡すのはなぜですか?あなたは通過しようとしていますか? '&prs [totale]'? –

+0

エラーが発生したことを読者に通知する必要があります。つまり、行番号を含む完全なエラーテキストを含める必要があります。 –

答えて

2

あなたが呼んでいる:

として定義され
inserire_dati(totale); 

:カプチュールトータルではあるが

void inserire_dati(persona* prs); 

:明白な誤りである

int totale = 0; 

を。しかし、バックグラウンドの問題は、あなたがデータを読み込むためのペルソナ構造のオブジェクトを持っていないということです私はあなたのコードを理解すると、その行は次のようになります。

inserire_dati(&prs[totale]); 

あなたはへのポインタを受け入れていますpersona構造体の構造体の内容を変更しようとしているので、この関数は正しい構造体です。 totaleは占領された最後の位置を保持しています(私は思うが、totaleを無条件にインクリメントする必要があります)。構造体へのポインタを取得するには、&をオブジェクトの前に置いてください。これはprs [totale]です。ベクトルの名前は先頭へのポインタなので、prs + totaleも使用できます。その場合、読みにくいポインタ演算を使用しています。

また、main()の最後の部分はわかりません。あなたが本当にC++を使用している場合

最後に、char[]代わりの文字列を使用する本当の理由はありません。

完全main()は次のようになります。

int main() 
{ 
    char risp = 0; 

    do { 
     inserire_dati(&prs[totale]); 
     ++totale; 
     cout << "Inserire un'altra persona? (S/N)" << endl; 
     cin >> risp; 
    } while (risp == 's' || risp == 'S'); 

    for(int i = 0; i < totale; ++i) { 
     leggere_dati(&prs[totale]); 
    } 
} 

しかし、よく、さらに取得し、私はあなたがグローバル変数としてカプチュールトータルを使用している参照してください。私は全体の構造のtotaleprsをラップします。

struct personas { 
    static const int Max = 100; 
    struct prs[Max]; 
    int totale; 
}; 

およびその他のいくつかのchanges which you can find in IDEOne

これが役に立ちます。

+1

は、std :: vectorやstd :: stringなどの適切なコンテナを使用することに注意してください。 –

+1

@ TheTechel時には、ベクトルのような動的なメモリを持つ必要はありません。 (そのため、私はstd :: stringがこのコードの大きな改善になることに同意します)。あなたは100人だけが必要な場合、その配列は大丈夫です。 – Shirkam

+1

@Shirkamしかし、あなたが100よりも少ないことが多い場合、より多くを割り当てることは無駄です。実際のプログラムで固定された数のオブジェクトしか必要としないのは何ですか?最大値を持っていても、固定長を割り当てることで無駄なスペースはいくらですか?パターンは、初心者にチュートリアルで教えられたようなものです。実際の世界ではほとんど使われていないものが必要です。 IMEでは、固定長配列の便利なケースは、Cの文字列を構成するバッファ、ハードウェアとのインタフェースなどです。これらのケースはかなりまれです。任意のオブジェクトに対しては、これはほとんど役に立ちません。 'std :: vector'について学ぶことはずっと便利です –

関連する問題