std::map und der Gebrauch.



  • Beispielsweise wäre dies eine Möglichkeit:

    #include <iostream>
    #include <sstream>
    
    int main()
    {
    	for(int i(0); i != 10; ++i) {
    		std::stringstream convert; // EDIT: Hier würde auch schon ein std::ostringstream reichen
    		convert << i;
    		std::cout << convert.str().append(".png").c_str() << "\n"; // .c_str() wäre in diesem konkretem Beispiel natürlich unnötig ;)
    	}
    
    	return 0;
    }
    

    EDIT die Zweite: Noch ein kleines Fehlerschen ausgemerzt. Es ist einfach noch zu früh 😉



  • stringstream stream;
            [...]
            stream << i << ".png";
            stream.str().c_str() // <-- "1.png" als c-string  für i = 1
            stream.str(""); // <-- string wieder löschen für die nächste eingabe
    

    Aber statt deines Arrays wäre es wohl einfacher mit vector zu arbeiten wie schon vorgeschlagen.

    EDIT:
    Da war wohl einer schneller 😮



  • Kahino schrieb:

    stream << i << ".png";
    

    Ja, das wäre natürlich noch eine Verbesserung des oben geposteten Codes. 🙂



  • hmm. Das ist doof.
    Wie macht man das denn richtig?

    Indem du bei den Grundlagen beginnst! Im FAQ dieses Forums gibt es genug Hinweise, wie man mit C++ beginnt.



  • Hallo Leute,

    Die Stringoperationen in C++ sind zwar alle super durchdacht und großteils auch toll umgesetzt, aber für solche Kleinigkeiten wirds dann schnell mal unübersichtlich.

    In C++ würde ich es mit einem Stringstream machen:

    std::stringstream ss;
      ss << i << ".png";
      scr[i] = IMG_Load(ss.str().c_str())
    

    (denn ss.str() liefert einen std::string retour und .c_str() liefert einen C-String vom std::string)

    Aber warum eigentlich nicht mit den bewährten C-Funktionen:

    char buffer[128];
      sprintf(buffer, "%d%s", i, ".png");
      scr[i] = IMG_Load(buffer);
    

    unter Visual C++ (also mit dem Microsoft Compiler) sollte die zweite Zeile sicherer lauten:

    sprintf_s(buffer, sizeof(buffer), "%d%s", i, ".png");
    

    Dadurch wird verhindert daß das Ergebnis größer werden kann als der buffer.

    In C++ gäbs auch noch eine Quick&Dirty Methode:

    scr[i] = IMG_Load( (std::string(itoa(i)) + ".png").c_str() );
    

    Ich denke ich würde mich für die zweite Methode entscheiden da die erste zu aufwendig und die letzte ganz übel gefährlich ist. Aber ich will ja nichts vorenthalten 😉

    mfg
    Elerian



  • Ich denke ich würde mich für die zweite Methode entscheiden da die erste zu aufwendig und die letzte ganz übel gefährlich ist. Aber ich will ja nichts vorenthalten

    Also 3 Zeilen ordentliches C++ ist aufwendiger als 3 Zeilen C? Das Argument verstehe ich nicht.



  • stringstream stream;
    char buffer[128];
    
    - - - - - - - - - - - -
    Das konstruieren ist für mich der entscheidenste Punkt von allen dreien wenn es um die intuitivität geht.
    stream << i << ".png";
    sprintf(buffer, "%d%s", i, ".png");
    
    - - - - - - - - - - - -
    
    scr[i] = IMG_Load(stream.str().c_str())  
     scr[i] = IMG_Load(buffer);
    

    Also ich finde die c++ variante sieht zum einen besser aus und ist nach meiner Einschätzung auch intuitiver zu nutzen.

    Aber das ist wohl auch eine Frage der Gewöhnung. Soll jeder wie er/sie will.



  • Kahino schrieb:

    Also ich finde die c++ variante sieht zum einen besser aus und ist nach meiner Einschätzung auch intuitiver zu nutzen.

    Das finde ich auch. std::stringstream erstellen, die Zeichenkette über den Eingabeoperator des std::stringstreams zusammenbasteln und das ganze ruck zuck der Funktion übergeben.

    Elerian schrieb:

    Ich denke ich würde mich für die zweite Methode entscheiden da die erste zu aufwendig und die letzte ganz übel gefährlich ist.

    Ich sehe darin ehrlich gesagt keinen großen Aufwand 😕



  • Alle Methoden abgelehnt, sind viel zu lang. Verwendet doch boost. Entweder boost::format oder boost::lexical_cast:

    // format:
    scr[i] = IMG_Load(str(format("%d.png") % i).c_str()); 
    
    // lexical cast:
    string filename = lexical_cast<string>(i) + ".png";
    scr[i] = IMG_Load(filename.c_str());
    

    Ist wesentlich kuerzer und weniger verbose als die stringstream-loesung, aber dabei typsafe (im gegensatz zu sprintf).



  • Also das verbose ist ja kein Grund. Dafür kann man sich ja eine einfache Funktion schreiben. Und wegen Geschwindigkeit: Wenn ich mich nicht irre arbeitet lexical_cast intern ja auch mit streams..

    EDIT:
    Was aber nicht heisst, dass ich das als keine schöne Lösung empfinde.



  • drakon schrieb:

    Also das verbose ist ja kein Grund. Dafür kann man sich ja eine einfache Funktion schreiben. Und wegen Geschwindigkeit: Wenn ich mich nicht irre arbeitet lexical_cast intern ja auch mit streams..

    EDIT:
    Was aber nicht heisst, dass ich das als keine schöne Lösung empfinde.

    Klar ist verbose ein Grund. Laengerer Code ist schwerer zu verstehen 😉 Und die Funktion musst du eben nicht selbst schreiben, denn genau das hat boost gemacht (und ja, lexical_cast verwendet stringstreams).
    Von Geschwindigkeit hab ich nie geredet, der Code vom OP ist ja nicht Performancekritisch (die boost-Loesungen sind sicher nicht effizienter als stringstreams, wobei die vermutlich nichtmal selbst Geschwindigkeitsbiester sind)


Anmelden zum Antworten