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



  • 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