void ptr und define



  • Hallo,

    ich hab innerhalb einem struct array einen void ptr, der den wert eines defines bekommt. Jetzt wollte ich gerne über einen switch den wert des ptr auslesen. leider funktioniert dies nicht...

    void *ptr = (unsigned short *) DEFINE;
    

    anders kann ich ja auf ein define nicht zugreifen, da es keine adresse aufweist.

    switch((unsigned short *)ptr)
    

    bringt beim switch eine fehlermeldung, lediglich das auslesen mittels printf funktioniert.

    Gibt es eine andere Möglichkeit als das define durch eine

    const unsigned short
    

    variable zu ersetzen?

    mfg
    Gerhard



  • Kannst du mal ein bisschen mehr Code zeigen? Wie sieht deine Struktur aus, wie dein Define?



  • Bashar schrieb:

    Kannst du mal ein bisschen mehr Code zeigen? Wie sieht deine Struktur aus, wie dein Define?

    im Prinzip lässt sich das Problem auf diesen einfachen void *ptr runterbrechen.

    struct _mystruct {
    
      void   *ptr; 
    }; 
    
    struct _mystruct Mystruct{
    
      {(unsigned short *)DEFINE}...
    };
    

    und im switch rufe ich dann

    switch((unsigned short *)ptr)
    

    auf.

    gruß
    Gerhard



  • Du kannst nicht anhand von Zeigern switchen. case-Labels müssen integer constant expressions sein.



  • Bashar schrieb:

    Du kannst nicht anhand von Zeigern switchen. case-Labels müssen integer constant expressions sein.

    hab ich fast erwartet. D.h. ich muss vom define weg und eine globale variable installieren...

    oder gibt es die möglichkeit vom zeiger den wert des defines in einer lokalen variable zu speichern?

    Gerhard



  • Das hat alles mit define oder nicht define absolut nichts zu tun. Um mal eins von vornherein klarzustellen: Ein Makro ist etwas, das der Präprozessor eins zu eins ersetzt, beim Compiler kommt davon nichts an. Du kannst also deine Frage auf etwas zurückführen, das sich auch ohne Makros formulieren lässt. Tu das bitte, und frag dann wieder. Es sei denn es findet sich irgendjemand, der verstanden hat, was du vorhast.



  • Gerhard-der schrieb:

    hab ich fast erwartet. D.h. ich muss vom define weg und eine globale variable installieren...

    nö, ein type-cast reicht. z.b:

    void *p = (void*)12;
    ...   
    switch ((ptrdiff_t)p) // <--- 'long' könnte auch gehen 
    {
       case 12:
       puts ("zwoelf");
       break;
    
       case ...
    ...
    

    🙂


Anmelden zum Antworten