Struktur in for-Schleife



  • Ich bin auch schon auf std::vector gekommen, nur dachte ich mir, dass ich das nicht gebrauchen kann, denn meine Struktur beinhaltet "Straße", "Hausnummer" und "Wohnort" und der Vector kann ja nicht unterscheiden was jetzt die Straße und was die Hausnummer ist. Also damit meine ich die Unterschiedlichen Typen (int, float, double, char, string...)



  • Doch, das passt schon. Der std::vector kann zwar (von Verschachtelungen mal abgesehen) nur einen Typ fassen, dies kann aber ein eigener Typ, eine Struktur sein.

    Beispiel:

    struct Adresse {
      std::string Strasse;
      int Hausnummer;
      std::string Wohnort;
    };
    
    std::vector<Adresse> Adressen;
    Adresse EineAdresse;
    EineAdresse.Strasse="GeekStreet";
    EineAdresse.Hausnummer=123;
    EineAdresse.Wohnort="Nerdhausen";
    Adressen.push_back(EineAdresse);
    
    std::cout << Adressen[0].Strasse;
    

    (ohne Gewähr 😉 )



  • struct Adresse
    {
        Adresse(std::string _strasse, std::string _hausnummer, std::string _wohnort)
       {
          this->Strasse    = _strasse;
          this->Hausnummer = _hausnummer;
          this->Wohnort    = _wohnort;
       }
    
      std::string Strasse;
      int Hausnummer;
      std::string Wohnort;
    };
    
    std::vector<Adresse> Adressen;
    
    Adressen.push_back( Adresse("Blumenstrasse", 5, "Musterstadt") );
    

    das ergebnis von size vor dem push_back() ergibt den Index vom neuen Element nach puch_back() aufruf.



  • Okay Danke, beide Methoden funktionieren! Aber wenn ich das jetzt in einer while-Schleife rein schiebe, dann "Crasht" das Programm. D. h. das Programm lädt und lädt und lädt. Hier hab ich mal meinen Code:

    std::string const Zeilen(std::string Zeile, int Position)
    {
        std::vector<std::string> Vec;
        std::stringstream sb(Zeile);
        std::string Word, a;
        while(sb >> Word)
        Vec.push_back(Word);
    
        return (static_cast<unsigned int> (Position) + 1 > Vec.size() ? "" : Vec[Position] );
    }
    float NachFloat(std::string Strings)
    {
    	float rtl = static_cast<float>(atof(Strings.c_str()));
    	return rtl;
    }
    struct SUCHE{
    	SUCHE(float _x, float _y, float _z)
    	{
    		this->x = _x;
    		this->y = _y;
    		this->z = _z;
    	}
    	float x;
    	float y;
    	float z;
    };
    void bla(char* filename)
    {
    	std::ifstream Datei;
    	Datei.open(filename, std::ios::in);
    
    	std::string Line;
    	std::vector<SUCHE> Suchen;
    	if(!Datei.eof())
    	{
    		getline(Datei,Line);
    		while(Line.find("asd"))
    		{
    			float xKoo = NachFloat(Zeilen(Line, 1));
    			float yKoo = NachFloat(Zeilen(Line, 2));
    			float zKoo = NachFloat(Zeilen(Line, 3));
    			Suchen.push_back(VERTICES(xKoo, yKoo, zKoo));
    		}
    	}
    }
    

    Als erstes dachte ich, dass da irgendwas voll ist, aber das kann ja nicht sein, oder?



  • Was willst du mit dem Code bezwecken?
    Den Sinn von Zeilen() sehe ich auch nicht. Wozu der Vektor? Was soll die Schleife? Soll die Funktion etwa ein Zeichen des Strings ausgeben? Dann nimm doch operator[] oder at() von string. Deine bla()-Funktion liest eine Zeile ein und findet dann unendlich lange per find() den String...
    Deine Konvertierungsfkt ist C-Stil.

    float NachFloat(string s) {
        stringstream sstr(s);
        float rtl;
        sstr >> rt1;
        return rtl;
    }
    


  • Mit meinem Code will ich eine Datei einlesen, nach bestimmten Sachen suchen und wenn er was gefunden hat, soll er (das rechts neben dem gesuchten) in einen Vector speichern.



  • (Sorry wegen Doppelpost)
    Also ungefähr so: Ich lese per ifstream eine Datei ein. Durchsuche sie mit find() und will dann (wenn was gefunden worden ist), das nebenstehende in einen Vector speichern und weitersuchen, bis die Datei durch ist.



  • Du darfst den Rückgabewert von Line.find() nicht implizit in einen bool konvertieren lassen! Genau das tust du aber, indem du den Ausdruck in die while -Schleifenbedingung setzt. Das gibt immer true zurück, wenn es nicht an 0-ter Stelle gefunden wird.

    Richtig wäre, bei nicht gefundenem Element auf std::string::npos zu prüfen:

    while (Line.find("asd") != std::string::npos)
    

    Zudem würde ich an deiner Stelle Initialisierungslisten im Konstruktor benutzen. Rückgabe von const -qualifizierten Objekten ist bedingt sinnvoll. Und Casts brauchst du eigentlich auch nicht so viele.



  • Ok vielen Dank! Jetzt lädt das Programm und ich bekomme (wenigstens) eine Fehlermeldung:http://img190.imageshack.us/i/unbenanntajn.jpg/

    Wie man aus der Fehlermeldung lesen kann, muss irgendwas an meiner Vector Initialisierung falsch sein. Ich kann aber irgendwie keinen Fehler sehen 😃 .



  • adelholzener schrieb:

    Wie man aus der Fehlermeldung lesen kann, muss irgendwas an meiner Vector Initialisierung falsch sein. Ich kann aber irgendwie keinen Fehler sehen 😃 .

    Wohl eher, dass du über den gültigen Bereich des std::vector hinausschreibst oder -liest. Kann ja eigentlich nur diese Zeile sein, soweit ich das sehe:

    return (static_cast<unsigned int> (Position) + 1 > Vec.size() ? "" : Vec[Position] );
    


  • Ich hab nich alles genau gelesen, aber sollte noch nich gekommen sein, hoffe ich ^^

    std::string Zeilen(const std::string &Zeile, std::size_t Position)
    {
        std::stringstream sb(Zeile); 
    
        for(std::string R; sb >> R; --Position)
        {
            if(!Position)
                return R;
        }
    
        return "";
    }
    

    bb



  • Danke, habe den Code mal ersetzt, hat sich aber leider nichts geändert (es kommt die gleiche Fehlermeldung).



  • Anhand des Callstacks (Aufrufliste) solltest du doch sehen können, in welcher Zeile der Fehler auftritt.



  • 😮 Die Liste ist leer. Entweder habe ich Visual C++ falsch eingestellt oder da steht wirklich nichts.



  • adelholzener schrieb:

    😮 Die Liste ist leer. Entweder habe ich Visual C++ falsch eingestellt oder da steht wirklich nichts.

    Hast du auch den Debug-Build (nicht Release) erstellt?



  • Ok habe es geschafft! Danke! 👍


Anmelden zum Antworten