Zugriff auf Struct Variable



  • Hallo zusammen
    Ich habe ein Problem mit dem Zugriff auf eine struct Variable

    file1.c:

    Struct *structs[10];
    
    structs[0]=load();
    structs[0]->init();
    

    file2.h:

    typedef struct
    {
    	BOOL *(init)(void);
    	int index;
    }Struct;
    
    Struct* load(void);
    

    file2.c

    Struct structs[10];
    
    BOOL init(void)
    {
    		//index?
    }
    
    Struct* load(void);
    {
    	static int localindex=0;
    	structs[localindex].index=localindex;
    	structs[localindex].init=init;
    
    	localindex++;
    }
    

    Der Code ist vereinfacht und schnell schnell wiedergegeben.

    Ich lade mit der Funktion load einen Funktionspointer mit der Internen Adresse. Nun kann ich über den Funktionspointer auf die Funktion zugreiffen und sie ausführen.
    Ausserdem befindet sich in der Struktur ein Index. Diesen benötige ich file2.c. (Ich benötige nicht umbedingt diese variable in der Struktur, eigendlich reicht es mir wenn ich den ArrayIndex herausfinden könnte).
    Het jemand eine Idee wie das machbar ist?
    Auf C++ oder ähnliches umzusteigen ist keine Option. Eine weitere Funktion um den Index zu setzten auch nicht. Und bei jedem Aufruf eines Funktionspointers den Index mitgeben ist auch keine gute Lösung für mich.
    Gruss Binggi


  • Mod

    Beschreib, was du erreichen möchtest, nicht die technische Umsetzung, die du dir vorstellst. Mag sein, dass du es zu stark vereinfacht hast, aber da sehe ich schon ein paar Designentscheidungen, die eher fragwürdig aussehen.

    Und bei jedem Aufruf eines Funktionspointers den Index mitgeben ist auch keine gute Lösung für mich.

    Das wäre der normale Weg. Was ist daran nicht gut? Du kannst das natürlich nochmals wrappen, in eine Funktion, die dein struct als Parameter nimmt und dann die in deiner Struktur referenzierte Funktion mit dem in der Struktur angegebenen Parameter aufruft:

    BOOL call(const Struct* functor)
    {
      return functor->init(functor->index);
    }
    

Anmelden zum Antworten