funktionsptr innerhalb von struct



  • Hi,

    hab ein Problem mit einem Funktionspointer: bekomm die Fehlermeldung "Fcnt" is not a member of _index

    index.h

    struct _index {
    
       unsigned int id; 
       void   (*Fcnt)(); 
    };
    

    index.c

    #include "tabelle.h"
    #include "index.h"
    
    struct _index Index[] = {
    
       {1, (void (*)())0}, 
       {2, (void (*)()) TblFnct)
    }; 
    
    //in einer function in index.c versuch ich auf die fkt zuzugreifen
    if(Index[1].Fcnt(1, (unsigned short *)0)!= 0)
      return 1;
    

    tabelle.h

    //funktionsdefinition
    unsigned short TblFnct(unsigned short row, unsigned short *error);
    

    Der Zugriff auf die ID funktioniert einwandfrei. Leider verstehe ich die Fehlermeldung nicht ganz, da ja der Funktionspointer in _index deklariert ist.

    mfg
    max



  • Mach Dir einen typedef für Deinen FctPtr. Dann sollte es gehen.



  • wie du siehst, hat die eine funktion 2 parameter, die andere hat keinen parameter



  • max baumgartner schrieb:

    //funktionsdefinition
    unsigned short TblFnct(unsigned short row, unsigned short *error);
    

    aber der function pointer in der struct ist vom typ: void ()()*
    das passt nicht zusammen.
    probier mal: unsigend short (*Fcnt)(unsigned short, unsigned short*)
    🙂



  • btw muss sowas immer ohne typedefs funktionieren



  • btw+ schrieb:

    btw muss sowas immer ohne typedefs funktionieren

    hab jetzt ein typedef angelegt, jedoch immer noch der gleich fehler

    index.h

    typedef unsigned short (*FnctPtr)(unsigned short, unsigned short *);
    
    struct _index {
    
       unsigned int  id; 
       FnctPtr      Fcnt; 
    };
    
    #include "tabelle.h"
    #include "index.h"
    
    struct _index Index[] = {
    
       {1, (FnctPtr)0}, 
       {2, (FnctPtr) TblFnct)
    }; 
    
    //in einer function in index.c versuch ich auf die fkt zuzugreifen
    if(Index[1].Fcnt(1, (unsigned short *)0)!= 0)
      return 1;
    

    gruß
    max



  • ok, jetzt funktioniert es; hatte noch einen Dreher drinnen bei Fcnt / Fnct...

    vielen dank für eure Hilfe
    max


Anmelden zum Antworten