Probleme mit struct



  • Moin
    Ich mache zzt eine Schulung zur Programmsprache C++ .
    Dabei komme ich beim Code einer Aufgabe nicht weiter.
    Es soll ein Lagerprogramm unter verwendung einer Struktur und eines Feldes in der erforderlichen Größe - hier 50erstellt werden. Soweit so gut.
    Bei meinem Programm erhalte ich die Fehlermeldung " i was not declared in line ...." jedoch wird int i in der ersten if Schleife deklariert.

    Kann von euch sich mal bitte den Code ansehen und mir erklären wo der oder die Fehler liegt/liegen.

    Danke im vorraus

    #include <iostream>
    
    
    using namespace std;
    
    
    // structur tulb = Teile und Lager Behaelter
    struct tulb{
        int tulbNr;
        int aktiv;
        double l;
        double b;
        double h;
        long double volumen;
    
    };
    
    
    
    // eine Kiste Einlagern
    lagern(tulb storage[])
    {
    
    
    int rein;
        cout << " EINLAGERN \n\n";
    
        cout << "Inventar Nr. der Kiste 1-50 : ";
        cin >> rein;
        if (rein<50 || rein>=1)
           {
           for (int i=0; i<=50; i++)
           {
               if( storage[i].aktiv != 1 && storage[50].tulbNr != rein)
               {
                   cout << " Laenge der Kiste : ";
                   cin >> storage[i].l;
                   cout << " Breite der Kiste : ";
                   cin >> storage[i].b;
                   cout << " Hoehe der Kiste  : ";
                   cin >> storage[i].h;
                   storage[i].aktiv = 1;
                   storage[i].tulbNr = rein;
                   storage[i].volumen = storage[i].l*storage[i].b*storage[i].h;
    
               }
               else
               {
                   cout << " Falsche Eingabe oder Lager voll \n\n";
               }
           }
        }
        return storage[i];
    }
    
    
    
    
    
    
    
    
    // DAten einer Kiste Ansehen
    ansehenSolo(tulb storage[])
    {
    
        cout <<" DATEN EINER KISTE ANSEHEN \n\n";
        cout <<"Inventar Nr. der Kiste - 1 bis 50 - : ";
        cin >> storage[50].tulbNr;
    
                if(storage[50].tulbNr !=0 && storage[50].aktiv==1)
        {
            cout << "Inventar Nr. der Kiste : " << storage[50].tulbNr << endl;
            cout << "Laenge der Kiste       : " << storage[50].l << endl;
            cout << "Breite der Kiste       : " << storage[50].b << endl;
            cout << "Hoehe der Kiste        : " << storage[50].h << endl;
            cout << "Volumen der Kiste      : " << storage[50].volumen << endl;
        }
        else
        {
            cout << "Lagerplatz ist leer \n";
        }
        return storage[50];
    }
    
    // Daten einer Kiste aendern
    aendern(tulb storage[])
    {
    
    
        cout << " DATEN AENDERN \n\n ";
        cout << "Inventar Nr. der Kiste :" << endl;
            cin >> storage[50].tulbNr;
    
            if (storage[50].tulbNr != 0 && storage[50].aktiv == 1)
               {
                cout << " Laenge der Kiste : ";
                cin >> storage[50].l;
                cout << " Breite der Kiste : ";
                cin >> storage[50].b;
                cout << " Hoehe der Kiste  : ";
                cin >> storage[50].h;
                storage[50].volumen = storage[50].l*storage[50].b*storage[50].h;
                storage[50].aktiv=1;
            }
            else {
                cout << "Der Lagerplatz ist leer" << endl;
            }
    
            return storage[50];
    }
    
    // Lagerbestand ansehen
    ansehenAlle(tulb storage[])
    {
    cout << " LAGERBESTAND \n\n";
    
    for (int i=0; i<50; i++)
        {
        if (storage[i].aktiv==1)
        {
            cout << "Inventar Nr. der Kiste : " << storage[i].tulbNr << endl;
            cout << "Laenge der Kiste       : " << storage[i].l << endl;
            cout << "Breite der Kiste       : " << storage[i].b << endl;
            cout << "Hoehe der Kiste        : " << storage[i].h << endl;
            cout << "Volumen der Kiste      : " << storage[i].volumen << endl;
    
    
        }
        else
        {
            if (storage[i].aktiv==0)
            {
                cout << " Lagerplatz leer \n";
            }
        }
    }
        return storage[i];
    }
    
    // Kiste Loeschen
    tulb auslagern(tulb storage[])
    {
        cout << " AUSLAGERUNG \n\n";
        cout << " Welche Kiste soll ausgelagert werden ? : ";
        cin >> storage[50].tulbNr;
        if (storage[50].aktiv==0)
        {
            cout << " Der Lagerplatz ist Leer \n";
        }
        if (storage[50].aktiv==1)
        {
          storage[50].aktiv=0;
          storage[50].b=0;
          storage[50].l=0;
          storage[50].h=0;
          storage[50].volumen=0;
          cout << " Kiste "<<storage[50].tulbNr<<" ausgelagert \n\n";
        }
        else
        {
            cout << " Falsche Eingabe \n";
        }
        return storage[50];
    }
    
    int main()
    {
        int menu;
        tulb storage[50];
    
    
    
        // Hauptmenu
    do
        {
        cout << "      HAUPTMENU \n\n";
        cout << " 1.   eine Kiste einlagern \n";
        cout << " 2.   Daten einer Kiste ansehen \n";
        cout << " 3.   Daten einer Kiste aendern \n";
        cout << " 4.   Kompletten Lagerbestand ansehen \n";
        cout << " 5.   eine Kiste Auslagern \n\n";
        cout << " 6.   Programm beenden \n";
        cin >> menu;
        if (menu == 1) tulb lagern();
        if (menu == 2) tulb ansehenSolo();
        if (menu == 3) tulb aendern();
        if (menu == 4) tulb ansehenAlle();
        if (menu == 5) tulb auslagern();
        if (menu == 6) exit(0);
        }
        while(menu !=6);
    
        return 0;
    }
    


  • @Seezer Bitte Code formatieren! (klicke auf die drei Punkte rechts, dann auf Bearbeiten, markiere den Code und klicke auf das </>-Symbol!)

    Du solltest ebenfalls die Zeile verraten, die dein Compiler anmeckert, das macht es einfacher!

    Im unformatierten Code kann man kaum was erkennen, aber ich vermute mal, dass dein return storage[i]; außerhalb der for-Loop ist und du dort deswegen nicht mehr auf i zugreifen kannst.



  • Ähnlichen und völlig falschen Code hatten wir hier doch vor ein paar Wochen. Wo hast du den abgeschrieben?

    Das hier z.B. cin >> storage[50].tulbNr;



  • @manni66
    Nirgends - Ich habe die Grundstruktur aus dem Lehrbuch genommen und versucht entsprechend zu erweitern.



  • @Seezer sagte in Probleme mit struct:

    @manni66
    Nirgends - Ich habe die Grundstruktur aus dem Lehrbuch genommen und versucht entsprechend zu erweitern.

    Und wie kommt man dann auf den cin >> storage[50].tulbNr; Blödsinn?



  • @Seezer sagte in Probleme mit struct:

    Ich habe die Grundstruktur aus dem Lehrbuch genommen

    Besteht die Chance, das Lehrbuch zu wechseln oder ist das von deinem Kurs fest vorgeschrieben?



  • Vielleicht auch mal ein weiterer Hinweis:
    Wenn du 50 Elemente in einem Array hast, dann haben diese die Indizes 0 bis 49. Du darfst NICHT auf das Element mit Index 50 zugreifen. Also ist alles, was wie storage[50].tulbNr oder ähnlich aussieht, falsch. Das 50. Element existiert nicht.

        if (menu == 1) tulb lagern();
        if (menu == 2) tulb ansehenSolo();
        if (menu == 3) tulb aendern();
        if (menu == 4) tulb ansehenAlle();
        if (menu == 5) tulb auslagern();
    

    Wo kommt hier jeweils das "tulb" her und was soll das bedeuten?



  • Das wurde wohl nur geschrieben, damit es (irgendwie) kompiliert...
    @Seezer weiß aber wohl nicht, was das bedeutet und wie ein Funktionsaufruf richtig aussehen muß?!



  • Fast allen von Deinen Funktionen fehlt der Rückgabetyp.



  • @Seezer sagte in Probleme mit struct:
    Also derartiger Quellcode ist in modernem C++ sehr unüblich:

    tulb storage[]
    

    Die Schulung scheint auf einem etwas älteren Stand zu sein.

    Vermutlich würde man das eher so machen:

    void aendern( std::vector<tulb> &mystorage )
    {
     // change something
    }
    

    oder noch besser, um nicht den ganzen Storage zu übergeben, wenn man nur ein einzelnes "tulb" braucht:

    void einzelnes_tulb_aendern( tulb &my_tulb )
    {
    }
    
    // aufruf:
    std::vector<tubl> Storage;
    auto iter_tulb_to_be_changed = findTulb( Storage, some_parameter );
    if ( iter_tulb_to_be_changed != Storage.end() )
        einzelnes_tulb_aendern( *iter_tulb_to_be_changed );
    
    


  • @daddy_felix Leider nicht . Werde mir aber noch ein zusätzliches Buch über C++ besorgen.



  • @It0101 Moin - mir fehlt eindeutig die Erfahrung um zu beurteilen ob die Schulung auf einem Aktuellen oder eher
    Älteren Stand der Dinge ist.

    std::vector darf für diese Übung nicht verwendet werden aber es bring mich auf eine Idee.

    Danke für den Input soweit



  • Dein Code sieht so aus, hätte dein Lehrer vor über 20 Jahren C programmieren gelernt und danach nur noch ein klein wenig C++ angeschaut.

    Dinge wie Klassen, typedef struct oder Datentypen ala bool fehlen komplett. Daher kommen auch die 20 Jahre. Mit dem C Standard C99, welcher 1999 kam, wurde der bool Datentyp eingeführt.

    Ich fürchte deine Schulung ist ein als C++ kaschierter 20 Jahre alter C Kurs.



  • @Seezer sagte in Probleme mit struct:

    @daddy_felix Leider nicht . Werde mir aber noch ein zusätzliches Buch über C++ besorgen.

    Dann lass dich dahingehend gut beraten hier (bzw. kram einen der Threads raus, die Frage wurde hier bestimmt schon zig mal gestellt). Es gibt verschiedene Meinungen, welches das beste C++ Buch ist, aber zumindest eine relativ klare Einigung welche Bücher man in Betracht ziehen könnte und welche man am besten direkt wegschmeißt.
    Meine Empfehlung wäre an dieser Stelle "Der C++ Programmier" vom Breymann.
    Schlechte Bücher überwiegen nämlich leider die Anzahl an guten Büchern.



  • @Leon0402 sagte in Probleme mit struct:

    Meine Empfehlung wäre an dieser Stelle "Der C++ Programmier" vom Bergmann.

    Du meinst Ulrich Breymann, nicht Bergmann.
    Ansonsten gibts auch noch den C++ Primer von Lippman.

    Beide Bücher sind empfehlenswert.


Anmelden zum Antworten