Variablen Substitution beim Casten



  • Das geht nicht. Beim cast wird ein Typ erwartet, keine Variable.
    Die einzige Möglichkeit besteht in der expliziten Auswertung eines Typ-Identifiers. Und dann hättest Du wieder etwas, das nahe am printf ist.



  • Tachyon schrieb:

    Die einzige Möglichkeit besteht in der expliziten Auswertung eines Typ-Identifiers. Und dann hättest Du wieder etwas, das nahe am printf ist.

    Bin einverstanden aber wie?



  • Wie schon gesagt:

    Tachyon schrieb:

    ...Und dann hättest Du wieder etwas, das nahe am printf ist.



  • Ein gangbarer Weg wäre:

    display(
            char    *fmt,
            ...
            )
    {
            va_start( args, fmt);
            vprintf( fmt, args);
            va_end( args);
    
    }
    

    Aufruf dann mit;

    display( "%10.2f", 123.89);
    


  • *lol* 😃



  • Scheppertreiber schrieb:

    display( "%10.2f", 123.89);
    

    Vielen Dank aber was hat es mit dem zu tun:

    void display (const char *VarType, void *Var)
    {
     printf ("%d\n", (VarType)Var);
    
     return;
    }
    
    //...
    
    int main()
    {
     display("double", 2.3 );
     return 0;
    }
    

    😕



  • Tim schrieb:

    *lol* 😃

    😡 was gibt's hier zu lachen? 😡



  • shuriko schrieb:

    Vielen Dank aber was hat es mit dem zu tun

    Du wirst auf die Schippe genommen, weil Du versuchst, etwas einfaches kompliziert zu machen.



  • Tachyon schrieb:

    shuriko schrieb:

    Vielen Dank aber was hat es mit dem zu tun

    Du wirst auf die Schippe genommen, weil Du versuchst, etwas einfaches kompliziert zu machen.

    Mag sein, dass es für Euch kinderleicht ist aber ich kriege es nicht hin. 😞

    Ich will den Caste-Typ der Funktion übergeben und es müsste egal sein, ob es int, double struct ABCD oder ähnliches ist...



  • shuriko schrieb:

    Tachyon schrieb:

    shuriko schrieb:

    Vielen Dank aber was hat es mit dem zu tun

    Du wirst auf die Schippe genommen, weil Du versuchst, etwas einfaches kompliziert zu machen.

    Mag sein, dass es für Euch kinderleicht ist aber ich kriege es nicht hin. 😞

    Ich will den Caste-Typ der Funktion übergeben und es müsste egal sein, ob es int, double struct ABCD oder ähnliches ist...

    Das geht in C nicht. printf tut schon das, was möglich ist.



  • gecasted wird nur im Quelltext, der wird kompiliert.

    Du kannst bestenfalls in der aufgerufenen Funktion abhängig von einem Datentyp
    einen switch einnbauen. Aber wozu eigentlich ?



  • Scheppertreiber schrieb:

    Aber wozu eigentlich ?

    Das ist eine Art der Trace-Funktionen. Ich wollte möglichst universelles und eifaches Interface entwickeln mit dem man z.B. alle int-Werte ausgeben kann.

    In meinem Beispiel habe ich nur kurz erwähnt, dass eine int-Variable eine Instanz einer Struktur sein könnte. Na ja, falsch gefragt...



  • Dann frage halt nochmal richtig ...



  • Scheppertreiber schrieb:

    Dann frage halt nochmal richtig ...

    Ok, morgen melde ich mich wieder. Danke für die Interesse.



  • Stellt euch vor, dass man in einer Funktion (z.B. main) an mehreren Stellen eine Art der Trace-Funktion (displayInt) benutzen will. Diese Funktion soll neben anderen Informationen auch die Adresse der Variable und den Weret anzeigen. In dieser Trace-Funktion wird die Ausgabe vorformatiert ausgegeben (z.B. farbig, eingerückt etc.). Dann gibt es eine globale Funktion (globalDisplay), die alle Traces anzeigt.

    void globalDisplay (int nCommand, char *pcFileName, char *pcFunction, int nLine, void *pnParamStruct)
    {
    
       if (pnParamStruct == NULL || pcFunction == NULL || nCommand < 0 || nLine < 0) return;
    
       switch (nCommand) {
    
          case 1:
          {
             displayInt (pcFileName, pcFunction, nLine, &(((struct ABC *)pnParamStruct)->a));
             displayInt (pcFileName, pcFunction, nLine, &(((struct ABC *)pnParamStruct)->b));
          }
          break;
          case 2:
          {
             displayInt (pcFileName, pcFunction, nLine, &(((struct DEF *)pnParamStruct)->d));
             displayInt (pcFileName, pcFunction, nLine, &(((struct DEF *)pnParamStruct)->e));
          }
          break;
          //
          // ...
          //
          case 88:
          {
             displayInt (pcFileName, pcFunction, nLine, &(((struct XYZ *)pnParamStruct)->y));
             displayInt (pcFileName, pcFunction, nLine, &(((struct XYZ *)pnParamStruct)->z));
          }
          default:
          {
             // ...
          }
       };
    
    }
    

    Wenn ich in meiner globalen Trace-Funktion ständig casten muss, dann will man mit der Zeit eine Art Automatismus implementieren. Deswegen habe ich mir diese Variante erdacht. Hier wird zusätzlich der Typ übergeben. Funktioniert natürlich nicht:

    void globalDisplay (int nCommand, char *pcFileName, char *pcFunction, char *pcTyp, int nLine, void *pnParamStruct)
    {
    
       if (pnParamStruct == NULL || pcFunction == NULL || pcTyp == NULL || nCommand < 0 || nLine < 0) return;
    
       switch (nCommand) {
    
          case 1:
          {
             displayInt (pcFileName, pcFunction, nLine, &(((pcTyp)pnParamStruct)->a));
             displayInt (pcFileName, pcFunction, nLine, &(((pcTyp)pnParamStruct)->b));
          }
          break;
          case 2:
          {
             displayInt (pcFileName, pcFunction, nLine, &(((pcTyp)pnParamStruct)->d));
             displayInt (pcFileName, pcFunction, nLine, &(((pcTyp)pnParamStruct)->e));
          }
          break;
          //
          // ...
          //
          case 88:
          {
             displayInt (pcFileName, pcFunction, nLine, &(((pcTyp)pnParamStruct)->y));
             displayInt (pcFileName, pcFunction, nLine, &(((pcTyp)pnParamStruct)->z));
          }
          default:
          {
             // ...
          }
       };
    
    }
    

    Falls welche Fragen gibt's, dann beantworte ich die gerne.

    Danke für die Tipps.



  • Ich glaube Du hast da einen Denkfehler:

    Das aus dem Code erzeugt .exe arbeitet nicht mit Variablennamen oder Strukturen,
    kann also nicht wissen wie die anzuzeigenden Daten angeordnet sind. Das muß der
    Compiler dementsprechend arrangieren.

    Du kannst der Funktion eine Kennung, um welche Struktur es sind handelt mitgeben.
    Mit dem im Quellcode verwendeten Bezeichner/Namen kann das nix anfangen.

    So hast Du keine Chance.


Anmelden zum Antworten