void * unter c++



  • Hallo,

    ich habe ein funktionierendes Ansi-C Programm das vereinfacht so aussieht:

    #define MAP_SIZE 	4096UL
    #define MAP_MASK 	(MAP_SIZE - 1)
    
    int main(){
    
    if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
    {
        printf("cant open /dev/mem.\n");
        return -1;
    }
    
    void *gpioportB;
    void *PIOB_PER;
    off_t targetB= 0xFFFFF600; 
    
    gpioportB = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, targetB & ~MAP_MASK);
    
    PIOB_PER= (gpioportB + (targetB & MAP_MASK) + 0x08);
    
    *((unsigned long *) PIOB_PER)= 0x40;  
    
    return 0;
    }
    

    Wenn ich das Programm nun in c++ kompiliere bekomme ich folgenden error
    (bei der PIOB_PER Zuweisung) :

    Fehler: Zeiger auf Typen »void *« in Arithmetik verwendet
    

    Kann mir einer erklären was das Problem ist, bzw wie ich es lösen kann?
    Gibt es Unterschiede beim void Zeiger zwischen c und c++?



  • allgemein kann man void* Zeiger in c++ auch verwenden, nur der compiler sagt du verwendest eben KEINEN Zeiger vom Typ void sondern einen zeiger AUF void, also praktisch einen Zieger auf einen void-Zeiger 🙂 . Spontan würde ich sagen dein Fehler liegt in Z.20 deines Codes, aber ich bin mir da nicht ganz sicher.

    mfg,
    andi01.



  • andi01 schrieb:

    allgemein kann man void* Zeiger in c++ auch verwenden, nur der compiler sagt du verwendest eben KEINEN Zeiger vom Typ void sondern einen zeiger AUF void, also praktisch einen Zieger auf einen void-Zeiger 🙂 . Spontan würde ich sagen dein Fehler liegt in Z.20 deines Codes, aber ich bin mir da nicht ganz sicher.

    Ganz schön verwirrende Beschreibung... Und zudem auch falsch.

    Die Fehlermeldung sagt ja bereits alles: ein Zeiger auf void wurde in einem arithmetischen Ausdruck verwendet. Du willst einen integralen Typ zu einem void* addieren - wie soll das gehen, wenn die Grösse des Typs (hier void ) nicht bekannt ist?

    Wenn du einen Zeiger auf T hast ( T ist irgendein Typ) und du berechnest einen Offset, ist der resultierende Zeiger um ein Vielfaches von sizeof(T) verschoben.

    T* ptr = ...;        // Adresse: x
    T* ptr2 = ptr + 5;   // Adresse: x + 5*sizeof(T)
    


  • ja, deine beshcreibung ist schon besser, wobei meine eigentlich gar nicht so falsch war, immerhin ist es ein zeiger auf void*, und der typ void* ist ja selbst eigentlich auch ein zeiger,eben vom typ void.

    mir hat eben die erklärung warum sein code falsch ist gefehlt, aber dein beiterag sollte egentlivh auch erklärung genug sein 🙂



  • andi01 schrieb:

    immerhin ist es ein zeiger auf void*, und der typ void* ist ja selbst eigentlich auch ein zeiger,eben vom typ void.

    Ich hab jetzt drei mal geschaut und kann immer noch keinen Zeiger auf void* entdecken. Wo versteckt er sich?



  • romil1@gmx.de schrieb:

    Wenn ich das Programm nun in c++ kompiliere bekomme ich folgenden error

    Fehler: Zeiger auf Typen »void *« [...]

    ich würd mal sagen der versteckt sich in der fehlermeldung... ("Zeiger auf typen void*")



  • andi01 schrieb:

    ich würd mal sagen der versteckt sich in der fehlermeldung... ("Zeiger auf typen void*")

    Ach nee. Dir ist aber schon aufgefallen, dass im gezeigten Code überhaupt kein Zeiger auf void* vorkommt?
    Wird wohl ein Spezialist gewesen sein, der "pointer of type void*" nicht übersetzen konnte.



  • jo, denke ich unterdessen auch, ich habs mir auch nochmal durchgelesen, ich kann auch keinen sehen, nur in der fehlermeldung 🙂

    auf den ersten Blick kann ich allerings auch keinen wirklichen Fehler sehen.

    @romil1@gmx.de:
    Gibt der Kompiler eigentlich keine Zeilenangabe aus??? das tun doch fast alle?!

    mfg,
    andi01.



  • andi01, du solltest definitiv aufmerksamer lesen.

    andi01 schrieb:

    auf den ersten Blick kann ich allerings auch keinen wirklichen Fehler sehen.

    Ich haben den Fehler in meinem Post erklärt!

    andi01 schrieb:

    @romil1@gmx.de:
    Gibt der Kompiler eigentlich keine Zeilenangabe aus??? das tun doch fast alle?!

    Kannst du nur mit absoluten Zeilenangaben umgehen? Er hat unmissverständlich geschrieben:

    romil1@gmx.de schrieb:

    Wenn ich das Programm nun in c++ kompiliere bekomme ich folgenden error
    (bei der PIOB_PER Zuweisung)


Log in to reply