Kopie einer Funktion (dynamisch)
-
hallo,
ist es in C möglich eine kopie einer funktion dynamisch zur laufzeit im speicher anzulegen und den zeiger auf diese funktion zurück zu erhalten?
also zb. so:int func1(int a) { /*code*/ } int main() { (*int)func2(int); func2 = copy_func(func1); }
func2 macht nun dasselbe wie func2 ist aber eine zweite, eigene funktion im speicher.
besten dank,
marco
-
Nein, ist nicht möglich. Was willst du damit erreichen?
-
ich arbeite mit JACK dem audioserver. über callback-funktionen holt er sich grob gesagt die zu spielenden audiodaten. dazu melde ich mich als client bei dem server an und schicke ihm eine adresse einer funktion, die er dann regelmäßig aufruft.
das problem ist nun, dass sich nun innerhalb meines programms mehrere clients bei dem server gleichzeitig anmelden können, aber alle auf dieselbe callback-funktion zeigen. dadurch werden die audiodaten, die sich jack ja mit dieser funktion holt, durcheinander gewürfelt.
unter c++ mit einer eigenen funktion pro objekt wäre das ja kein problem. aber ich muss bei diesem projekt mit c arbeiten.
gruß, marco
-
Marcomania schrieb:
unter c++ mit einer eigenen funktion pro objekt wäre das ja kein problem. aber ich muss bei diesem projekt mit c arbeiten.
Unter C++ hättest du dasselbe "Problem". Auch Memberfunktionen gibt's nur einmal im Speicher.
Aber genau für diesen Zweck gibt es den void*-Parameter bei jack_set_process_callback. Daran kannst du die Callbacks unterscheiden.
-
Wo ist das Problem. Du erstellst einfach einen Struct
struct obj { void *(func)(struct obj *o, ...daten); andere daten... };
und dann machst du
void func(struct obj *o, ...daten) { verarbeite daten; } ... struct obj o; o.func = func; ..... o.func(&o, ...);
Somit kannst du die Daten vernünftig verarbeiten.
Im Grunde brauchst du nichtmal void *(func)(struct obj *o, ...daten);
So wäre es aber C++ ähnlich mit objekt.func();
-
@MFK:
okay, das c++ die memberklassen alle nur einmal im speicher hat wusst ich nicht.
mein problem ist letztlich, dass JACK die pcm-daten meiner verschiedenen clients innerhalb meines programms nicht mixt, sondern nur verwürfelt, abgehackt ausgibt. hab keine ahnung warum er das tut, denn das programm zweimal aufgerufen (sind ja im grunde auch nur 2 clients) und es klappt mit dem mixen.falls sich jemand mit JACK auskennt (kann auch gerne quellcode posten):
ich hab einen struct, der alle nötigen daten für einen JACK client bereit hält und eine menge funktionen, die immer als ersten parameter einen zeiger auf den entsprechende "JACK-client-daten-struct" erwarten. jack_set_process_callback bekommt als void* eben auch einen zeiger auf dieses struct, die für jeden client neu angelegt wird.ich hatte jetzt vermutet dass das nicht-mixen der audiodaten der clients damit zusammenhängt, dass mehrere clients auf ein und diesselbe process-callback-funktion zeigen.
wenns das nicht ist und keiner rat weiß, muss ich wohl oder übel ein paar tage jack-quellcode lesen...
gruß, marco