Herrausfinden von Funktionsparametern anhand des pointers auf die Funktion



  • Hallo zusammen,

    ich stehe grade vor einem Problem.
    Und zwar arbeite ich mit einem Codegenerator welcher vom Benutzer generierte Funktionen erstellt. Diese funktionen werden als Object files compiliert.
    Ich habe nun mit einem AWK script das MAP file geparst und komme so an den Funktionspointer und auch die übergabeparameter dran.
    Wie kann ich nun mit diesen Funktionen Dynamisch eine Funktion aufrufen. Ich meine ich kann ja schlecht für jede Parameterkombination einen Funktionsrumpf erstellen.
    Gibt es eine methode um in der Laufzeit einen passenden funktionsrumpf zu erstellen? Es werden vorerst nur Standerttypen benötigt wie int float double usw.

    In meinem Hauptprogramm bekomme ich dann ein void* array welches informationen über die datentypen und die übergabeparameter selber hat.

    Ich hoffe ich konnte mein Problem einigermaßen gut darstellen.
    Vielen dank schonmal für eure Hilfe



  • Versuch mal eine Struktur zu übergeben.
    Du hast damit nur einen parameter. Natürlich musst du
    in der Funktion die entsprechenden Werte hinterlegen.

    Happy Coding



  • ...sorry, hat sich ein typo eingeschlichen.
    Die Werte müssen in der Struktur vorhanden sein.



  • Du kannst alle Funktionen, mit gleichem return Type,
    für deinen Kompiler als foo(...) deklarieren.

    Dann kanst du foo mit beliebigen Argumente auf den stack pushen ...

    Gruß Frank



  • Danke erstmal für eure antworten!

    kannst du mir das mal genauer erklären wie du das meinst Frank vielleicht an nem kleinen Beispiel.
    das problem ist ja grade das ... von foo(...) 🙂

    Hier mal nen kleines beispiel:

    int test(int val){
      ...
    }
    
    int main(){
      void * (*fkt) (int); 
      int fkt_ptr=0x12345; /* angenommen 0x12345 ist die Addresse von test(int val) */
      fkt=(int (*) (int) )fkt_ptr;
      fkt(123);
      return 0;
    }
    

    der returntyp ist immer der gleiche, nur können die Übergabeparameter in typ und anzahl variieren... Wie meinst du das mit "Auf den Stack schieben"?
    In Java und c# gibts glaub ich sowas wie reflection, damit kann man infos zu klassen / Funktionen bekommen. Gibts das auch in c?



  • irgendwie so etwas, wobei ich es mit VA selbst noch nicht gemacht habe ...

    // Beispiel Funktion
    int functionIntInt (int i)
    {
        return i;
    }
    
    // function type with variable arguments, returning int
    typedef int TFunctionIntVA (...);
    
    // anstelle von 'functionIntInt' kommt dann deine ermittelte Funktionsadresse
    TFunctionIntVA fct = (TFunctionIntVA) functionIntInt;
    
    // das ist dann der Aufruf, wobei mir noch nicht klar ist ob dir das soo reicht ...
    int i = fct(123);
    

    Gruß Frank



  • schau dir doch mal eine printf() implementation an... es gibt keine möglichkeit den typ des arguments zu erhalten ohne ihn per argument mitzugeben.



  • Oder vieleicht hier: http://sourceware.org/libffi/

    ps. sag Bescheid, wenn du was passendes gefunden hast.

    Gruß Frank


Anmelden zum Antworten