Problem - Array von Zeigern auf Funktionen. Compiler zählen lassen.



  • hi!

    int (*pfunc[])() = 
    {
        func1, func2 
    };
    

    Obiges funktioniert.
    Aber wie schreibe ich das, wenn ich die Deklaration und Definition in einer Headerdatei und eine Quelltextdatei bei offen gelassenem Idexoperator aufteilen will ?
    Oder geht das gar nicht?
    Habe schon zahlreiche Versuche hinter mir. 😃 😡
    Die hier rein zu schreiben schenke ich mir mal lieber. 😃
    Gruß
    🙂



  • in den header:

    typedef int (*FPTR)();
    

    ...und in das .c file:

    FPTR a[] = {f1, f2}; 
    FPTR b[] = {f1, f2, f3}; 
    FPTR c[] = {f1, f2, f3, f4}; 
     ... usw.
    

    🙂


  • Mod

    cfunc pointer nOOb schrieb:

    Aber wie schreibe ich das, wenn ich die Deklaration und Definition in einer Headerdatei und eine Quelltextdatei bei offen gelassenem Idexoperator aufteilen will ?

    Deklaration:

    extern int (*pfunc[])();
    

    Definition wie gehabt. Dabei bleibt der Typ von pfunc nat. unvollständig, folglich kannst du die Größe vor der Definition nicht per sizeof bestimmen. Aber du kannst selbstverständlich eine Konstante im Header deklarieren, die dann in der ÜE, in der auch pfunc definiert wird, entsprechend statisch initialisiert wird.



  • vielen dank für die antworten !!!

    so hab ich das auch schon probiert:

    // func.h
    extern int (*pfunc1[])();	
    int (*pfunc2[])();
    
    // func.c
    pfunc1[] = {f1, f2}; 
    pfunc2[] = {f1, f2};
    

    aber das funzt
    nicht mit der begründung:
    error: 'pfunc1' : redefinition; different type modifiers
    see declaration of 'pfunc1'

    error: 'pfunc2' : redefinition; different type modifiers
    see declaration of 'pfunc2'

    ebenso dies:

    // func.h
    typedef int (*FPTR)(); 
    FPTR a[];
    // func.c
    a[] = {f1, f2};
    

    error 'a' : redefinition; different type modifiers
    see declaration of 'a'

    auch das geht komischer weise nicht:

    // func.h
    int( *fptr[2] )();
    
    // func.c
    fptr[0]  = f0;
    

    hier werden gleich zwei fehlermeldungen spendiert:
    error: cannot allocate an array of constant size 0
    error: 'fptr' : redefinition; different type modifiers

    wenn ich es aber in eine funktion packe, dann frisst der
    compiler das erstaunlicher weise:

    // func.h
    int( *fptr[2] )(); // festgebrannter index
    // func.c
    void init()
    {
    	fptr[0]  = f0; // funzt
    	fptr[1]  = f1; // dito
    }
    

    naja, den index fest zu brennen wollte ich mir ja sparen:

    #define FESTGEBRANNT 2
    fptr[FESTGEBRANNT] = ...
    

    die anzahl der pointer 'festzubrennen'
    scheint aber nicht anders zu gehen.

    gruß
    fp-n00b


  • Mod

    fptr n00b schrieb:

    vielen dank für die antworten !!!

    so hab ich das auch schon probiert:

    // func.h
    extern int (*pfunc1[])();	
    int (*pfunc2[])();
    
    // func.c
    pfunc1[] = {f1, f2}; 
    pfunc2[] = {f1, f2};
    

    aber das funzt
    nicht mit der begründung:
    error: 'pfunc1' : redefinition; different type modifiers
    see declaration of 'pfunc1'

    error: 'pfunc2' : redefinition; different type modifiers
    see declaration of 'pfunc2'

    so geht es:

    // func.h
    extern int (*pfunc[])();	
    // func.c
    int (*pfunc[])() = {f1, f2}; // oder auch
    extern int (*pfunc[])() = {f1, f2};
    

    fptr n00b schrieb:

    ebenso dies:

    // func.h
    typedef int (*FPTR)(); 
    FPTR a[];
    // func.c
    a[] = {f1, f2};
    

    error 'a' : redefinition; different type modifiers
    see declaration of 'a'

    so geht es:

    // func.h
    typedef int (*FPTR)(); 
    extern FPTR a[];
    // func.c
    FPTR a[] = {f1, f2};
    

    fptr n00b schrieb:

    auch das geht komischer weise nicht:

    ...
    

    Das hatten wir bereits, im Header darf keine Definition stehen, da dies zu Mehrfachdefinition führen würde. Eine Variablendeklaration ist eine Definition, es sei denn, die Variable wird mit extren deklariert und es wird kein Initialisierer angegeben. Was du im .c versuchst, ist syntaktisch eine Zuweisung, keine Definition.

    fptr n00b schrieb:

    wenn ich es aber in eine funktion packe, dann frisst der
    compiler das erstaunlicher weise:

    // func.h
    int( *fptr[2] )(); // festgebrannter index
    // func.c
    void init()
    {
    	fptr[0]  = f0; // funzt
    	fptr[1]  = f1; // dito
    }
    

    Natürlich, da Ausdrucksstatements (und diese Zuweisungen sind Ausdrücke) nur in Funktionen auftreten dürfen.

    fptr n00b schrieb:

    naja, den index fest zu brennen wollte ich mir ja sparen:

    #define FESTGEBRANNT 2
    fptr[FESTGEBRANNT] = ...
    

    die anzahl der pointer 'festzubrennen'
    scheint aber nicht anders zu gehen.

    Wie bereits erwähnt:

    // func.h
    extern int (*pfunc[])();
    extern const size_t pfuncs;
    // func.c
    int (*pfunc[])() = {f1, f2};
    const size_t pfuncs = sizeof pfunc / sizeof *pfunc;
    


  • so, mit eurer hilfe ist es mir endlich gelungen die aufteilung
    in header- und quelltext-datei nach meiner nase zu machen
    🙂

    ich habe mir eine kleine datei geschrieben, welche verschiedene
    möglichkeiten auflistet.
    die 'zeiger auf funktionen array schreibweise' habe ich morgen sowieso wieder vergessen 😃

    hier ein paar möglichkeiten:

    // *.h
    int myInt;
    int myIntArr[];
    int myIntArrFixed[2];
    
    extern int (*pfunc1[])();   
    int (*pfunc2[])(); 
    typedef int (*FPTR)();
    FPTR a[];
    int( *fptr_fixed[2] )();
    
    // *.c
    myInt			= 1;					// ok
    myIntArr[]		= { 0,0,0 };			// ok
    myIntArrFixed[2] = { 0,0 };				// ok
    
    (*pfunc1[])()		= {f1, f2, f3, f4};	// ok
    (*pfunc2[])()		= {f1, f2, f3};		// ok
    (*a[])	 ()		= {f1, f2};				// ok
    (*fptr_fixed[])() = {f3,f4};		    // ok
    

    gruuhuuuß 👍
    🙂


Anmelden zum Antworten