#define und Zahl zu einem String zusammensetzen



  • hottehüh schrieb:

    ok danke mal aber da ich das wie gesagt mit einer Schleife bilde
    Habe ich nun nicht "M_Value1" sondern "M_Valuei"

    Na dann verwende "sprintf"!



  • Wo? im Makro



  • Also so wäre es mir am liebsten:

    Ich rufe das Makro auf und erhalte den entsprechenden String

    also

    CString name;
    for( int i=1; i<10; i++)
    {
        name = MValue(1);
    
        ...
    }
    

    in name steht nun "MValue1" , "MValue2" usw. Geht das?



  • Warum nicht!?

    Vielleicht solltest Du mal den Zusammenhang genauer erklären, was Du genau willst...



  • Edit:

    CString name;
    for( int i=1; i<10; i++)
    {
        name = MValue(i);
    
        ...
    }
    


  • Warum nicht!?
    

    Weil ich bisher noch keine Lösung habe die funktioniert.


  • Mod

    hottehüh schrieb:

    Warum nicht!?
    

    Weil ich bisher noch keine Lösung habe die funktioniert.

    Du hast mit #define angefangen und Deine Frage nicht genau gestellt.
    Also haben wir Dir eine #define Lösung angeboten.

    Jochen hat Dir sprintf nahe gelegt. Warum gehst Du dem nicht nach?

    Ansonsten lies mal ein wenig Tutorials.

    Edit:

    CString name; 
    for( int i=1; i<10; i++) 
    { 
        name.Format(_T("MValue%d"),i); 
    
        ... 
    }
    


  • Hallo

    Ja das weiß ich das das geht. Aber ich möchte eine define darum habe ich auch mit define angefangen.
    Dann habe ich mein Beispiel gezeigt und gefragt ob es so möglich ist

    CString name;
    for( int i=1; i<10; i++)
    {
        name = MValue(i);
    
        ...
    }
    

    Und Jochen Kalmbach hat darauf geantwortet: Warum nicht.
    Also nun meine Frage wie geht es mit einem define.



  • Das geht nicht... defines funktionieren nur zur Compilezeit!



  • Hm

    Also wenn ich nun einer Funktion den Namen übergeben muss. Brauch ich immer zwei Zeilen.

    name.Format(_T("MValue%d"),i);
    MyDunction(name);
    

    Dachte ich könnte abkürzen mit:

    MyFunction(MValue(i));
    

    Schade.



  • Warum muss es denn ein #define sein. Warum reicht dir nicht eine Funktion?



  • Dies war nur ein einfaches Beispiel.
    Habe noch viele Variablen. Diese sind alle als defines deklariert. Nun haben diese aber alle eine unterschiedliche Anzahl an Platzhaltern. Über eine Funktion wären die Anzahl an Parametern aber fest.
    Dann bräuchte ich ja mehrere Funktionen. Klar die möglichkeit mit einer Elipse würde noch bestehen. Dies wollte ich halt eher vermeiden. Dachte halt es gibt eine einfache Lösung mit Makros



  • hottehüh schrieb:

    name.Format(_T("MValue%d"),i);
    MyDunction(name);
    

    Genau, das ist die Lösung...

    Alternativ kannst Du natürlich den Format-String und die Variablen auch direkt in die Funktion reingeben und es in der Funktion erst zusammenbauen... siehe auch "printf"... da wird ja genau das gemacht...



  • hottehüh schrieb:

    Dies war nur ein einfaches Beispiel.
    Habe noch viele Variablen. Diese sind alle als defines deklariert. Nun haben diese aber alle eine unterschiedliche Anzahl an Platzhaltern. Über eine Funktion wären die Anzahl an Parametern aber fest.
    Dann bräuchte ich ja mehrere Funktionen. Klar die möglichkeit mit einer Elipse würde noch bestehen. Dies wollte ich halt eher vermeiden. Dachte halt es gibt eine einfache Lösung mit Makros

    Variablen als defines? Ich glaube da verwechselst du was. defines sind für konstante Textersetzungen gedacht und nicht für Variables.

    Im Übrigen können Funktionen auch eine variable Anzahl von Parametern besitzen.



  • Variablen als defines? Ich glaube da verwechselst du was. defines sind für konstante Textersetzungen gedacht und nicht für Variables.

    Ja es sind Textersetzungen. Das sind nur Variablennamen aus einem anderen System die ich einlesen muss. Da habe ich mich falsch ausgedrückt.

    Im Übrigen können Funktionen auch eine variable Anzahl von Parametern besitzen.

    Ja. Habe ich auch kommentiert:

    Klar die möglichkeit mit einer Elipse würde noch bestehen. Dies wollte ich halt eher vermeiden.



  • Wenn es nicht geht, dann muss ich wohl doch eine Funktion mit Variabler Anzahl an Argumenten verwenden.

    Könte mir da jemand noch ne Hilfe zu den Makros va_list, va_arg, irgendwie komme ich mit den Anleitungen die es im Netz gibt nicht zurecht.

    Meine Funktionsrumpf sollte ja nun so aussehen:

    CString BuildVarName(const CString &name, ...)
    {
       CString varname = "";
    
       va_list marker;
    
       va_start( marker, ) //hier fehlt das zweite Argument
    
       //bei der Schleife komm ich auch nicht zurecht.
       while()
       {
    
       }
    
        va_end( marker );
    
        return varname;
    
    }
    

    Könntet ihr mir noch etwas auf die Sprünge helfen.


Anmelden zum Antworten