[BraLUG] C-Frage: Pointer auf Funktionen mit unterschiedlicher Anzahl von Parametern?

Max design-champ at web.de
Do Mai 20 19:47:29 CEST 2010


Hi Uwe,

vorweg schonmal die Frage, soll dein Programm eine dynamische Tabelle 
besitzen, sodass der Nutzer neue Eintraege erstellen kann oder eine 
hardcoded?

Wenn letzteres der Fall ist, dann musst du wohl oder uebel in den sauren 
Apfel beissen und fuer die Funktionen seperate Funktionszeiger 
deklarieren e.g.:

int a(){printf("a");}
void b(){printf("b");}
char c(int a){printf("c");return a;}

struct
{
	int (*a)();
	void (*b)();
	char (*c)(int);
} table = {&a,&b,&c};

int main(int argc, char**argv)
{
	table.a();
	table.b();
	table.c(2);
	return 0;
}

Ohne sie weiss der Compiler nicht wie er die Funktionen aufrufen soll.

Du koenntest zwar die Typen und Anzahl der Parameter seperat zu jedem 
Zeiger speichern und einen Aufruf Wrapper bauen der dann den Aufruf 
durchfuehrt aber da ist es einfacher wenn du einfach die Funktionszeiger 
anstaendig deklarierst.

Hoffe ich konnte helfen, wenn nicht dann nicht :)

gruesse Max



On 20.05.2010 18:03, Uwe Berger wrote:
> MoinMoin,
>
> eine Frage an die C-Spezialisten, vielleicht hat ja jemand eine Idee:
>
> Man kann ja, nach der bekannten Methode, Funktionen über Pointer
> aufrufen. Bei der Typ-Deklaration solcher Funktionspointer muss man,
> wenn diese Funktionen Parameter haben, laut "Lehrbuch", die Typen der
> Übergabeparameter mit deklarieren. Soweit so gut und kein Problem, wenn
> die so verpackten Funktionen alle die gleiche Anzahl von
> Übergabeparametern haben und die Typen ebenfalls gleich sind. Damit kann
> man dann ja auch, wie ich das auch möchte, eine schicke Tabelle mit
> allen Funktionspointern usw. aufbauen....
>
> Mein Problem: die Anzahl der Übergabeparameter und deren Typ ist bei mir
> nicht gleich! Erschwerend kommt dazu, dass ich nicht in jeder Funktion
> eine Mimik ala va_list, va_start, va_arg, va_end einbauen möchte, also
> ich sie unverändert lassen möchte (weil sie halt gegeben sind und u.U.
> im Programm auch ohne Funktionspointer aufgerufen werden sollen usw. bzw. Bestandteil einer Lib sind).
>
> Frage, gibt es einen Weg dieses Problem irgendwie doch zu lösen!
>
> Grüße&  Danke Uwe
>
>




Mehr Informationen über die Mailingliste Bralug