Frage zu Code / Pointer



  • Hallo,
    ich will folgenden code verstehen:

    static void buttons_isr( void* context, alt_u32 id ) {
      volatile int *function = (volatile int*) context;
      *function = IORD_ALTERA_AVALON_PIO_EDGE_CAP( BUTTONS_BASE );
      IOWR_ALTERA_AVALON_PIO_EDGE_CAP( BUTTONS_BASE, 0 );
      IOWR_ALTERA_AVALON_PIO_IRQ_MASK( BUTTONS_BASE, 0xF );
    }
    

    es wird eine funktion deklariert mit 2 variablen
    - pointer context der void ist
    - id die alt_u32 ist
    in der funktion wird ein weitere pointer initialisiert welchem context zugewiesen wird (als int gecastet)
    sehe ich das richtig??

    Dazu meine Frage:
    warum wird context als void initialisiert? als int wäre doch viel logischer?
    wozu der 2. pointer funktion? ich kann doch auch direkt

    *context = IORD_ALTERA_AVALON_PIO_EDGE_CAP( BUTTONS_BASE );
    

    schrieben?

    Danke schon mal



  • Hallo,

    goaran schrieb:

    warum wird context als void initialisiert?

    Damit der Aufrufer einen Zeiger auf einen beliebigen Typen übergeben kann.

    goaran schrieb:

    wozu der 2. pointer funktion? ich kann doch auch direkt

    *context = IORD_ALTERA_AVALON_PIO_EDGE_CAP( BUTTONS_BASE );
    

    schrieben?

    Das geht nicht, weil sich ein Zeiger auf void nicht dereferenzieren lässt.

    Gruß,
    B.B.



  • Soche Konstrukte werden in C häufig verwendet um generisch programmieren zu können.

    Irgendwelche zwischenschichten müssen nicht wissen was sich hinter dem void* verbirgt.

    z.B. ein generischer container myList hält intern nur einen void*.

    Beim reinstecken kenn ich den Typ,
    bei rauslesen muss ich casten um drauf zugreifen zu können.

    Ich hoffe das war einigermaßen verständlich.

    Gruß Frank


Log in to reply