Design-Frage



  • Ich habe sehr viele Funktionen oder Funktoren, die nacheinander aufgerufen werden und dabei auf Speicher zugreifen möchten.

    Die meisten FUnktionen benötigen in etwa die selben Datenstrukturen, aber einige Ausnahmen benötigen noch ein paar Extras.

    Da ich sehr viele Funktionen habe und diese sehr oft aufrufe und durchwechsle, möchte ich gerne den Speicher für alle gemeinsam anlegen und in einer Datenstruktur übergeben. Die Speicherallokation möchte ich gerne mit einer Klasse machen, so dass nach dem Enmde eines OBjktes automatusch wieder alles freigegeben wird.

    Wie kann ich nun erreichen, dass der Speicher nur einmal angelegt wird und dass keine Funktionen mehr aufgerufen werden, nachdem der Speciher freigegeben wurde?


  • Mod

    Du übergibst ihnen ein Argument.



  • shisha schrieb:

    ...
    Da ich sehr viele Funktionen habe und diese sehr oft aufrufe und durchwechsle, möchte ich gerne den Speicher für alle gemeinsam anlegen und in einer Datenstruktur übergeben. Die Speicherallokation möchte ich gerne mit einer Klasse machen, so dass nach dem Enmde eines OBjktes automatusch wieder alles freigegeben wird.

    Wie kann ich nun erreichen, dass der Speicher nur einmal angelegt wird und dass keine Funktionen mehr aufgerufen werden, nachdem der Speciher freigegeben wurde?

    Nun, wenn ich diese doch sehr vage beschreibene Problematik richtig verstanden habe, dann bietet C++ einen passenden Mechanismus: Klassen und Member-Funktionen (Methoden). Einer Member-Funktion wird die Datenstruktur automatisch implizit übergeben (der "this-Pointer" auf die Klasseninstanz), und man muss sich schon etwas Mühe geben, wenn man nach Lebensende des Objekts eine Member-Funktion aufrufen möchte (zumindest bei automatischen Objekten oder wenn ein Pointer auf das Objekt nach dessen Zerstörung ordentlich genullt wird). Auch nutzen die Member-Funktionen den mit der Klasseninstanz allozierten Speicher gemeinsam (Member-Variablen), zumindest wenn sie für dasselbe Objekt aufgerufen werden.

    Finnegan



  • ICh habe echte Schwieriugkeiten das Problem zu beschreiben.

    Das mit der Klasse könnte ich mir vorstzellen.
    Kann man so etwas wie ein Array an Funktionen anlegen, und einen Zeiger auf die aktuell zu nutzende Funktion specihern?

    Also ganz grob:

    class A:
      FUNCTION_ARGUMENT_TYPE arg // all the needed memory
    
      functions [] 
      current_function
    

  • Mod

    shisha schrieb:

    ICh habe echte Schwieriugkeiten das Problem zu beschreiben.

    Das ist aber wichtig, denn sonst sieht es so aus, als würdest du gerade aus Unkenntnis eine super-komplizierte Selbstbaulösung für eine Problem bauen wollen, welches durch eine einfache Variable trivial gelöst werden kann.



  • Die "Funktionen" sind kleine Algorithmen, die in einer seltsamen DSL vorliegen. Den Speicherbedarf muss ich irgendwie automatisch ermitteln, indem ich alle Eigabefiles parse.

    Auis der DSL muss ich dann die C-Funktionen erstellen, den Speicherplatz für alle Funktionen zur Verfügung stellen und die Funktionen aufrufen.
    Wie die Funktionen aufgerufen werden (also eher in welcher Reihenfolge, wie oft und mit welchen Parametern) bestimmt wiederum ein anderer Algorithmus.

    Deswegen hätte ich gerne diese Art Array von Funktionen, in dem ich alle generierten Funktionen eintrage. Irgendwann äöndert sich die aufzurufende Funktion nicht mehr. Deswegen hätte ich gerne einen Zeiger auf die aktuelle Funktion. Dieser muss dann später einem anderen Algorithmus übergeben werden.



  • Die "Funktionen" sind kleine Algorithmen, die in einer seltsamen DSL vorliegen. Den Speicherbedarf muss ich irgendwie automatisch ermitteln, indem ich alle Eigabefiles parse.

    du könntest dir auch aus den DSLs C/C++-Code generieren, eine DLL erstellen und diese wieder laden und ausführen - dann musst du keinen komplizierten Interpreter bauen 🙂



  • shisha schrieb:

    Deswegen hätte ich gerne diese Art Array von Funktionen, in dem ich alle generierten Funktionen eintrage. Irgendwann äöndert sich die aufzurufende Funktion nicht mehr. Deswegen hätte ich gerne einen Zeiger auf die aktuelle Funktion. Dieser muss dann später einem anderen Algorithmus übergeben werden.

    Also, Array von Funktionen könnte man z.B. so machen:

    int foo(int i){return i*42;}
    
    [...]
    
    vector<function<int(int)>> vf;
    vf.push_back([](int i){return i+2;});
    vf.push_back(&foo);
    
    for (auto &f : vf) cout << f(7) << '\n';
    

    Ich habe jetzt einen Vektor von Funktionen, die int nehmen und int returnen. Da kannst du dann einfach drüberloopen und die ausführen. Suchtest du sowas?


Log in to reply