Zugriff auf verschachtelte struct klappt nicht



  • Hallo zusammen, ich habe in "Code Blocks" einen kleinen Versuch mit verschachtelten Strukturen gebastelt.

    Anbei der Code.

    Ich würde jetzt gerne für den Planeten "Erde" noch einen Kontinent erstellen, den ich mit Werten füllen kann. Beispielsweise mit dem Namen "Eurasien". Dann soll es aber auf dem Planeten "Mars" auch noch einen Kontinent Eurasien geben, selbstverständlich mit anderen Daten. Ich probiere schon ewig, aber es will nicht klappen, eine ganz typische Fehlermeldung die ich immer hatte war "unqualified-id before '.'".

    Wie stelle ich das an?

    Was ich erreichen will, ist zum Beispiel sowas hier:

    erde.eurasien.flaeche = 234567;
    mars.eurasien.flaeche = 12345;
    merkur.eurasien.flaeche = 354;

    Doppelte Kontinent-Namen auf unterschiedlichen Planeten soll es also geben dürfen.

    #include <iostream>
    
    using namespace std;
    
    struct kontinentType
    {
        double flaeche;
        string klima;
    };
    
    struct planetType
    {
        struct kontinentType;
        double umlaufzeitTage;
        double radius;
        string farbe;
    };
    
    int main()
    {
        // Neue Planeten deklarieren und Member mit Werten füllen
    
        planetType erde;
    
            erde.umlaufzeitTage = 365.25;
            erde.radius = 6378;
            erde.farbe = "blau";
    
            // Neuen Kontinent für diesen Planeten erstellen und Member mit Werten füllen
            // Fehler: expected unqualified-id before '.' token
            struct erde.kontinent eurasien;
    
                erde.eurasien.flaeche = 123456;
                erde.eurasien.klima = "gemaessigt";
    
        planetType mars;
    
            mars.umlaufzeitTage = 700;
            mars.radius = 3500;
            mars.farbe = "rot";
    
        // Neuen Planeten deklarieren und alle Werte von der Erde übernehmen
    
        planetType kepler186f;
        kepler186f = erde;
    
        // Kontrolle der Werte
    
        cout << "Kepler186f Umlaufzeit Tage: " << kepler186f.umlaufzeitTage << endl;
        cout << "Kepler186f Radius         : " << kepler186f.radius << endl;
        cout << "Kepler186f Farbe          : " << kepler186f.farbe << endl;
    
        return 0;
    }
    


  • struct planetType
    {
        kontinentType eurasien;
        double umlaufzeitTage;
        double radius;
        string farbe;
    };
    


  • struct planetType
    {
        vector<kontinentType> kontinente;
    // oder auch
    //  map<string, kontinentType> kontinente;
    
        double umlaufzeitTage;
        double radius;
        string farbe;
    };
    


  • Danke für die Beiträge, die Compilerfehler sind erstmal weg, und es klappt. Anbei der nun funktionsfähige Code.

    Kann ich Code Blocks irgendwie dazu bringen, dass er mir nur genau die Kontinente anzeigt, die es nur auf dem jeweiligen Planeten gibt? Wenn ich also schreibe: "erde." dann sollen als Vorschläge auch nur die Strukturmember auftauchen die es für "erde" gibt, und nicht etwa "erde.vallesMarineris", das gibt's ja nur auf dem Mars.

    Bild des Dropdown-Menüs: http://fs5.directupload.net/images/151016/temp/7j75k78p.jpg

    #include <iostream>
    
    using namespace std;
    
    struct kontinentType
    {
        double flaeche;
        string klima;
    };
    
    struct planetType
    {
        kontinentType eurasien, australien, vallesMarineris;
        double umlaufzeitTage;
        double radius;
        string farbe;
    };
    
    int main()
    {
        // Neue Planeten deklarieren und Member mit Werten füllen
    
        planetType erde;
    
            erde.umlaufzeitTage = 365.25;
            erde.radius = 6378;
            erde.farbe = "blau";
    
            // Neue Kontinente für diesen Planeten erstellen und Member mit Werten füllen
    
            erde.eurasien.flaeche = 22234;
            erde.eurasien.klima = "gemaessigt";
    
            erde.australien.flaeche = 52334;
            erde.australien.klima = "warm";
    
        planetType mars;
    
            mars.umlaufzeitTage = 700;
            mars.radius = 3500;
            mars.farbe = "rot";
    
            // Neue Kontinente für diesen Planeten erstellen und Member mit Werten füllen
    
            mars.eurasien.flaeche = 85434;
            mars.eurasien.klima = "kalt";
    
            mars.vallesMarineris.flaeche = 155;
            mars.vallesMarineris.klima = "eiskalt";
    
        // Kontrolle der Werte
    
        cout << "Erde, Eurasien, Flaeche        : " << erde.eurasien.flaeche << endl;
        cout << "Erde, Eurasien, Klima          : " << erde.eurasien.klima << endl;
    
        cout << "Erde, Australien, Flaeche      : " << erde.australien.flaeche << endl;
        cout << "Erde, Australien, Klima        : " << erde.australien.klima << endl;
    
        cout << "Mars, Eurasien, Flaeche        : " << mars.eurasien.flaeche << endl;
        cout << "Mars, Eurasien, Klima          : " << mars.eurasien.klima << endl;
    
        cout << "Mars, Valles Marineris, Flaeche: " << mars.vallesMarineris.flaeche << endl;
        cout << "Mars, Valles Marineris, Klima  : " << mars.vallesMarineris.klima << endl;
    
        return 0;
    }
    

  • Mod

    Codeschnipsel schrieb:

    Kann ich Code Blocks irgendwie dazu bringen, dass er mir nur genau die Kontinente anzeigt, die es nur auf dem jeweiligen Planeten gibt? Wenn ich also schreibe: "erde." dann sollen als Vorschläge auch nur die Strukturmember auftauchen die es für "erde" gibt, und nicht etwa "erde.vallesMarineris", das gibt's ja nur auf dem Mars.

    Unwahrscheinlich, denn die eigentliche Ursache ist ein schweres Designproblem in deinem Code. Bei dir gibt es schließlich auf jedem Planeten alle Kontinente. hustbaer hat schon zwei schöne Designalternativen gezeigt, die sehr viel sinnvoller sind.



  • SeppJ schrieb:

    hustbaer hat schon zwei schöne Designalternativen gezeigt, die sehr viel sinnvoller sind.

    Geht leider nicht, weil:
    "error: 'vector' does not name a type"
    und:
    "error: 'map' does not name a type"



  • Du musst deren Header inkludieren, google mal.



  • Das wird mir jetzt zuviel. Da fehlt's noch an den Grundlagen. Vor allem bei "vector"...



  • Du scheinst Namen der Variablen mit deren Werten zu verwechseln.

    Mit "planetType" erstellst du eine allgemeine Beschreibung für einen Planetentyp (wieso überhaupt Typ?). Ein Planet hat eine Menge an Kontinenten, das hat @hustbaer ja schon gut dargestellt. Die Code Completion arbeitet nicht mit Werten konkreter Instanzen (wie auch? die können sich ja während der Ausführung dauernd ändern), sondern nur mit den Namen der Variablen.

    btw, schreib bitte std::vector (oder std::map) 😉


Anmelden zum Antworten