Funktion mit variabler Argumentenliste (ähnlich CString::Format)



  • Hallo,

    ich möchte eine Funktion in meinem Programm unterbringen, die Daten in ein LogFile schreibt.
    Den Aufruf der Funktion stelle ich mir ähnlich wie z.B. bei CString::Format vor, dass ein String mit Formatbezeichnern und anschließend eine unbestimmte Zahl von verschiedenen Argumenten übergeben wird.

    In der Funktion möchte ich das dann in einen CString wandeln und in die Datei schreiben.

    Ich weiß jetzt nur nicht, wie ich die Funktion deklariere und wie ich dann die Argumente in den CSTring bekomme. Das muß wohl irgendetwas mit va_list zu tun haben, aber dahintergestiegen bin ich leider nicht.

    Hat hier vielleicht jemand einen Tipp für mich?

    Danke

    Andreas



  • schau mal nach dem Parameter "...", damit kann man eine Variable Anzahl deklarieren.



  • OK danke,

    das:

    void CWimmerOPCClientApp::SchreibeLog(CString Meldung,...)
    

    kompiliert schon mal ohne Fehler, aber wie bekomme ich die Argumente jetzt in meinen CString eingearbeitet 😕



  • Du deklarierst die Funktion mit Standardinitalisierungen

    //in *.h
    long double calc(CString tja, long double A=0.0, long double B=0.0, CStrin test="abc");

    -> Du kannst am Anfang Variablen angeben die immer angegeben werden müssen,
    und hinten welche die angegeben werden können

    Gruß leo



  • Das wäre natürlich auch möglich...

    aber mit der "richtig" variablen Argumentenliste wäre es natürlich wesentlich flexibler.

    Es muss doch eine Möglichkeit geben, eine solche Liste variabel zu gestalten, printf und CString::Format können das ja schließlich auch...
    Nur steig ich bei den Quelltexten dieser Funktionen nicht durch, wie das funktioniert...



  • so irgendwie in der art?

    test(int argc, const CString* argv[] )





  • das geht aber tatsächlich

    static void tMyFormat(int argc, const CString* argv[] )
    {
    
    }
    


  • Hallo

    Es gibt auch die Möglichkeit die Funktion mehrmals zu deklarieren

    //in .h
    void abc (CString abc, double A)
    void abc (CString abc, double A, double 😎
    aber dann müssen die Argumente verschienden angeordnet sein oder die
    Anzahl der Argumente verschieden sein.

    Ein vollvariables Verfahren ist mir nicht bekannt. Wenn du eins findest sag
    mir Bescheid

    Gruß leo



  • das ist aber ein Zeiger auf ein Feld oder?



  • Pellaeon schrieb:

    das ist aber ein Zeiger auf ein Feld oder?

    ja, die länge ist variabel und du hast dann zugriff mit

    ...
    bla bla = argv[i];
    

    einfach forschleife und gut ist

    @leo145 , ok was ist wenn ich mal 50 CStrings reinfüttern will? soll ich pauschal lieber mal eine parameterliste machen welche 100 parameter hat ( davon 99 mit default? )

    lol



  • Also,

    ich habe das Problem jetzt mit dieser va-list gelöst:

    void CWimmerOPCClientApp::SchreibeLog(CString FormatText,...)
    // Meldung in Log-Datei I:\WimmerOPCClientLog.txt schreiben
    {
    	CString Ergebnis;
    	va_list argList;
    	va_start(argList, FormatText);
    	Ergebnis.FormatV(FormatText, argList);
    	va_end(argList);
    
    	CStdioFile Datei;
    	CString Text;
    	if(Datei.Open("\\\\Surfer\\Data\\WimmerOPCClientLog.txt",CFile::modeWrite | CFile::modeNoTruncate | CFile::modeCreate)){
    		Datei.SeekToEnd();
    		CTime Jetzt = CTime::GetCurrentTime();
    		Text.Format("%s\t%s\n",Jetzt.Format("%d.%m.%Y %H:%M:%S"),Ergebnis);
    		Datei.WriteString(Text);
    		Datei.Close();
    	}
    }
    

    Ich kann die Funktion jetzt wie beispielsweise printf(..) aufrufen:

    SchreibeLog("TestText: %s\tTestDouble: %.2f\tTestLong: %ld","TestText!",3.14159265,345675234);
    

    und erhalte das formatierte Ergebnis als Eintrag mit Datum und Uhrzeit hinten an mein Logfile angehängt...


Anmelden zum Antworten