Anfänger: Wie schreibe ich eine Initialisierung für eine struct...



  • ...die einen eingegebenen char Wert (Vorname und Nchname) einen leeren String zuweist.

    struct eintraege{
    char Vorname[50];
    char Nachname[50];
    char Strasse[50];
    };
    eintraege Adressen[100];

    Würde mich freuen wenn da jemand ne Idee hat.

    MFG

    der blonde Mr.Blond



  • Hi,

    Strukturen können einen Konstruktor haben.

    struct eintraege{
       char Vorname[50];
       char Nachname[50];
       char Strasse[50];
    // constructor
       eintraege() { memset(this, 0, sizeof(*this)); }
    };
    


  • ..Habe mich vielleicht falsch ausgedrückt.
    Ich möchte die Werte (Adressen die ich in dem Feld Telefonbuch speichere) beim Aufruf so initialisieren das den Namen ein leerer String zugewiesen wird.

    Vielleicht hast du dazu ne Idee?

    Danke schon mal.



  • Genau das passiert hier doch, aber es geht auch anderst

    struct eintraege{
       char Vorname[50];
       char Nachname[50];
       char Strasse[50];
    // constructor
       eintraege()
        : Vorname (""), Nachname (""), Strasse ("")
       {}
    };
    


  • In der Funktion void eingabe(eintraege Telefonbuch)...
    bekomme ich beim übersetzen in der der Zeile:

    cin>>Telefonbuch.Telefonnummer[a];

    einen Fehler angezeigt. fehler lautet: E2062 Unzulässiger Indirektionsoperator.

    Das ganze Programmm sieht bisher so aus:

    #include <iostream.h>

    struct eintraege{
    char Vorname[50];
    char Nachname[50];
    int Telefonnummer;

    };
    eintraege Telefonbuch[100];

    //Funktion fuer Initialisierung
    //eintraege initialisiere(char Vorname, char Nachname, int Telefonnummer){
    // Telefonbuch.Vorname= Vorname + cout << " ";
    // Telefonbuch.Nachname= Nachname + cout<< " ";
    // Telefonbuch.Telefonnummer= Telefonnummer;
    // return(Telefonbuch);
    //}

    void eingabe (eintraege Telefonbuch){
    static int a;
    cout<<"Bitte geben Sie den Vornamen ein: ";
    cin>>Telefonbuch.Vorname[a];
    cout<<"Bitte geben Sie den Nachnamen ein: ";
    cin>>Telefonbuch.Nachname[a];
    cout<<"Bitte geben Sie die Telefonnummer ein: ";
    cin>>Telefonbuch.Telefonnummer[a];
    a++;
    }

    void Nummereingabe (eintraege Telefonbuch)

    void loeschen (eintraege Telefonbuch)

    void anzeigen (eintraege Telefonbuch)

    void main(){
    char Auswahl;
    cout <<"Telefonbuch" <<endl;
    cout <<"neuer Eintrag: a" <<endl;
    cout <<"Suche nach Eintragnummer: b" <<endl;
    cout <<"Eintrag loeschen: c" <<endl;
    cout <<"Eintrag anzeigen: d" <<endl;
    cin >> Auswahl;
    switch(Auswahl){
    case 'a':
    cout <<eingabe()<<endl;
    break;
    case 'b':
    cout<<Nummereingabe()<<endl;
    break;
    case 'c':
    cout << loeschen()<<endl;
    break;
    case 'd':
    cout << anzeigen()<<endl;
    break;
    default:
    cout<< "Bitte treffen Sie eine Auswahl die das Menue ermoeglicht" <<endl;
    }
    char p[50]
    cin.getline(p,50);
    cin.getline(p,50);
    }

    Vielleicht kannst du mir auch dabei weiterhelfen. Scheinst ja Ahnung zu haben.



  • cin>>Telefonbuch.Telefonnummer[a];
    

    ==>

    cin>>Telefonbuch[a].Telefonnummer;
    

    mfg JJ



  • [C++ Fehler] Unit1.cpp(30): E2094 'operator+' ist im Typ 'eintraege' für Argumente des Typs 'int' nicht implementiert

    :-((



  • Und was ist 'Unit1.cpp(30)'? Meine Kristallkugel ist immer noch in der Reparatur.
    Oder hast du vielleicht hier die Kommentartoken wieder entfernt?

    //Funktion fuer Initialisierung
    //eintraege initialisiere(char Vorname, char Nachname, int Telefonnummer){
    // Telefonbuch.Vorname= Vorname + cout << " ";
    // Telefonbuch.Nachname= Nachname + cout<< " ";
    // Telefonbuch.Telefonnummer= Telefonnummer;
    // return(Telefonbuch);
    //}
    


  • Hi,

    dein Programm enthält einige Fehler... 😃

    Anstatt mit einem Array von fester größe zu hantieren, würde ich lieber
    einen Vektor verwenden.
    Zudem übergibst Du das globale Array 'by value'. Das bedeutet, das es jedesmal
    auf dem Stack kopiert wird. 👎

    Mit einen Vektor könnte es folgendermaßen aussehen:

    #include <iostream>
    #include <vector>
    
    struct eintraege{
    	char Vorname[50];
    	char Nachname[50];
    	int Telefonnummer;
    	eintraege() { memset(this, 0, sizeof(*this)); } // werte initialisieren
    }; 
    
    typedef std::vector< eintraege > Telefonbuch; // vector definieren
    
    void eingabe(Telefonbuch* telefonbuch) // telefonbuch übergabe 'by descriptor'
    {
    	eintraege Eintrag; // tempräres eingabe objekt
    	cout << "Bitte geben Sie den Vornamen ein: ";
    	cin  >> Eintrag.Vorname;
    	cout << "Bitte geben Sie den Nachnamen ein: ";
    	cin  >> Eintrag.Nachname;
    	cout << "Bitte geben Sie die Telefonnummer ein: ";
    	cin  >> Eintrag.Telefonnummer;
    
    	telefonbuch->push_back(Eintrag); // temporäres object in vektor kopieren
    }
    
    void ausgabe(const Telefonbuch& telefonbuch)  // übergabe 'by reference'
    {
            // alle Einträge ausgeben
    	for (size_t i = 0; i < telefonbuch.size(); ++i)
    	{
    		cout << "-----------------------------------------------" << endl;
    		cout << "Vorname: " << telefonbuch[i].Vorname << endl;
    		cout << "Nachname: " << telefonbuch[i].Nachname << endl;
    		cout << "Telefonnummer: " << telefonbuch[i].Telefonnummer << endl;
    		cout << "-----------------------------------------------" << endl;
    	}
    }
    
    int main(int argc, char* argv[])
    {
    	Telefonbuch MeinTelefonbuch; // lokaler vektor für einträge
    
    	char Auswahl;
    	cout <<"Telefonbuch" <<endl;
    	cout <<"neuer Eintrag: a" <<endl;
    	cout <<"Suche nach Eintragnummer: b" <<endl;
    	cout <<"Eintrag loeschen: c" <<endl;
    	cout <<"Eintrag anzeigen: d" <<endl;
    	cin >> Auswahl;
    
    	switch(Auswahl){
    		case 'a':
    			eingabe(&MeinTelefonbuch);  // adresse des vektors übergeben
    			break;
    		case 'b':
    			break;
    		case 'c':
    			break;
    		case 'd':
    			break;
    		default:
    			cout << "Bitte treffen Sie eine Auswahl die das Menue ermoeglicht" << endl;
    			break;
    	}
    
    	ausgabe(MeinTelefonbuch);  // vektors als Referenz übergeben
    
    	char p[50];
    	cin.getline(p,50);
    	cin.getline(p,50); 
    
    	return 0;
    }
    

    Den rest solltest du selber schaffen, wenn du den Code verstanden hast.

    Gruss

    EDIT: zur Demonstration habe ich die Übergabe an die Funktion 'ausgabe' als
    Referenz abgeändert, da diese den Vektor nur ausgibt und nicht verändert.



  • Hi Mr.Blond,

    bevor ich Alternativen anführe erstmal zu deinen Fehlern.

    1.) Du definierst alle deine Funktionen mit jeweils einem Parameter. Beim
    Aufruf gibst jedoch keinen Parameter an. (COMPILER-FEHLER)
    2.) Du verwendest asl Parameter "eintraege Telefonbuch" vermutlich mit der
    Absicht dein gesamtes Telefonbuch als Parameter zu übergeben. Das klappt
    so nicht, auf deine Art übergibst du lediglich den ersten Eintrag als
    Parameter. (VERSTÄNDNIS-FEHLER)
    3.) Selbst dieser Parameter nutz dir nur wenig da du ihn "by Value" übergibst
    und er daher nicht (permanent) geändert werden kann. (VERSTÄNDNIS-FEHLER)
    4.) Wenn, nach all den Korrekturen, deine Funktionen mal funktionieren solltest
    du mal über den Sinn von deinen lokalen static Variablen nachdenken.
    (VERSTÄNDNIS-FEHLER)
    5.) Globale Parameter sind zu vermeiden solange es nicht unbedingt notwendig
    ist. Was bei dir nicht der Fall ist.

    Wie's besser geht siehst du bei EarlyBird. Ich bezweifle jedoch das du seine
    Lösung nachvollziehen kannst. Daher empfehle ich dringend ein Tutorial oder
    ein Anfängerbuch, sonst wird das nix. 🙂

    mfg JJ


Anmelden zum Antworten