2 Strings aus Funktion zurückgeben



  • Hallo zusammen

    Ich habe ein Problem, wo ich nicht weiterkomme:

    Ich habe die Funktion string TimeStammp()

    Bis jetzt gab es mir immer die ganze Zeit im Format "JJJJ_MM_DD_HHh_MMm_SSs" zurück

    Ich brauche es nun aber so, das Datum und Zeit getrennt zurückgegeben wird. Also:

    String1 = JJJJ_MM_DD
    String2 = HH:MM:SS

    Ist das überhaupt möglich in nur einer Funktion?

    string CFlukeReader::timeStamp(void)
    {
            //Irgendwelche Zeitberechnungen
    
    	zeit = jahr + "_" + monat + "_" + tag + "_" + stunde + "h_" + minute + "m_" + sekunde + "s";
    
    	string timeStamp( zeit ); 
    
    	return timeStamp;
    }
    

    Bin froh über beispiele

    Danke



  • Nein, man kann nur einen Wert zurückgeben. Aber ich find das was du vorhast nicht sehr handlich.
    Der normale Lösungsweg wäre eine KLasse DateTime, die zur Speicherung von Datum und Uhrzeit aber keine Strings sondern integer her nimmt (dann kann man auch was mit der Klasse anfangen!), diese bekommt dann ein Funktionen zur formatierten Ausgabe, z.B. formatTime(), die dein gewünschtes Ergebnis als string zurückgeben.
    Schau dir aber auch mal boost.datetime an, wenn du am Ende mehr als nur Ausgaben machen willst.



  • Also, ich muss schlussendlich das Datum uund die Zeit nur ausgeben. Die Funktion werde ich nicht ersetzen, da ich sie schon überall in meinem Programm verwendet habe. Und ich noch nicht sehr fortgeschritten in c++ bin.

    Dann muss ich wohl noch eine zweite Funktion erstellen.



  • Der beste Lösungsweg wäre doch eher eine Klasse Date _und_ eine andere Klasse Time. Eine dritte Klasse könnte dann ein Objekt von Date und Time beinhalten.
    Vorteil: Oft braucht man nur ein Datum, manchmal nur eine Zeit. Wenn man beides braucht, dann bedient man sich der dritten Klasse.



  • Ja warum einfach machen wenns auch kompliziert geht.
    Antwort auf die eigentliche Frage: in C++ kann man immer nur ein Objekt zurückgeben. Allerdings gibt es std::pair. Damit kann man z.B. ein std::pair<std::string, std::string> zurückgeben.

    std::pair<std::string, std::string> Foo()
    {
        std::string s1 = ...;
        std::string s2 = ...;
        return std::make_pair(s1, s2);
    }
    
    void Bar()
    {
        std::pair<std::string, std::string> result = Foo();
        std::string s1 = result.first;
        std::string s2 = result.second;
    }
    


  • Vicious Falcon schrieb:

    Der beste Lösungsweg wäre doch eher eine Klasse Date _und_ eine andere Klasse Time. Eine dritte Klasse könnte dann ein Objekt von Date und Time beinhalten.
    Vorteil: Oft braucht man nur ein Datum, manchmal nur eine Zeit. Wenn man beides braucht, dann bedient man sich der dritten Klasse.

    Das tönt ziemlich logisch

    Aber wenn ich es so brauch wie unten:

    Ich will ein Datum, und eine Zeit in ein CSV schreiben:

    outputFile << Date << ";" << Time;

    Sollte ich dann nicht eine Klasse DateTime erstellen, mit einer Funktion für das Datum und einer Funktion für die Zeit und eine Funktion für beides?

    Dann würde ich einfach nur DateTime::Date und DateTime::Time verwenden.

    Könnte das so klappen?



  • void timestamp ( std::string& date, std::string& time )
    {
      // ...
      date = "...";
      time = "...";
    }
    
    // ...
    int main ( int argc, char** argv )
    {
      std::string date, time;
      timestamp( date, time );
      std::cout << "date: " << date << ", time: " << time << std::endl;
      return 0;
    }
    

    Aber die Lösung mit Klasse(n) ist natürlich zu bevorzugen da es später viel einfacher ist diese zu erweitern und auch zu warten.

    Gut Schuß
    VuuRWerK 😉



  • Wenn du die Funktionsaufrufe nicht ändern willst, dann schreibe einfach die Funktion um. Die beiden Teilstrings fügst du mit strcat in einen Rückgabestring mit einem Trennzeichen um, z.b. "string1@string2". Nach den Aufrufen dröselst du die beiden Strings wieder auf - fertig! Ist nicht sehr elegant, aber machbar.



  • Du kannst den operator<< für Time und Date definieren. DateTime ruft im operator<< die entsprechenden Operatoren der Klassen auf.
    Selbstverständlich könnten für die Ausgabe noch verschiedene Formate auswählbar sein.
    Date:
    20.10.2010 oder
    10/20/2010 oder
    20. Okt. 2010
    Time:
    15:09:53 oder
    03:09:53 pm
    Auch zusätzliche Methoden wie
    Time GetAsGMT();
    könnten hilfreich sein.



  • IMO ist die beste Lösung 100%ig davon abhängig, was Du mit dem Zeug weiter anfangen möchtest.

    Wenn Du eben nur eine kleine Hausaufgabe machen musst und es daher egal ist, wie erweiterbar oder änderbar dein Code ist, ist std::pair doch genau das Richtige. Das ist schnell und allokiert wenig unnötigen Speicher, wenn der Compiler halbwegs vernünftig arbeitet.

    Neue Klassen zu bauen, wenn man die gar nicht benötigt, finde ich nicht gut. Für gut zugeschnittene Lösungen müsstest Du mehr Informationen über die weitere Verwendung liefern.


Anmelden zum Antworten