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

Uwe Berger bergeruw at gmx.net
Fr Mai 21 15:13:40 CEST 2010


MoinMoin,

nach einigem Rumüberlegen und -diskutieren mit anderen Leuten, sieht meine
Lösung erstmal so aus (Max, dein Ansatz passt nicht ganz, weil ich bei der
Ziellösung ein indizierbares Array mit den Funktionspointern benötige;
hatte ich nicht erwähnt...;-)):

#define FUNC_VOID_VOID		0
#define FUNC_VOID_INT		1
#define FUNC_VOID_INT_INT	2

typedef struct {
			char* funct_name;
			union ftp {
				void (*VoidFuncVoid)(void);
				void (*VoidFuncInt)(int);
				void (*VoidFuncIntInt)(int, int);
			} funct_ptr;
			uint8_t type;
			uint8_t arg_count;
} callfunct_t;


void a(void) {
	printf("a");
}

void b(int p1) {
	printf("b: p1=%i", p1);
}

void c(int p1, int p2) {
	printf("c: p1=%i; p2=%i", p1, p2);
}

callfunct_t callfunct[] = {
		{"a", .funct_ptr.VoidFuncVoid   = a, FUNC_VOID_VOID,    0},
		{"b", .funct_ptr.VoidFuncInt    = b, FUNC_VOID_INT,     1},
		{"c", .funct_ptr.VoidFuncIntInt = c, FUNC_VOID_INT_INT, 2}
};

int main(void) {
	callfunct[0].funct_ptr.VoidFuncVoid();
	callfunct[1].funct_ptr.VoidFuncInt(1);
	callfunct[2].funct_ptr.VoidFuncIntInt(1, 2);
    return 0;
}

funct_name und arg_count in der Tabelle benötige ich zum "Finden" des
gewünschten Tabelleneintrages bzw. um in einer Wrapper-Funktion die
Parameter auszulesen. (Die Funktionsaufrufe in main() sind nur testweise
und sehen im Zielprogramm etwas anders aus...).


Mir ist bewusst, dass es eine Dirty-Lösung ist (wg. den unterschiedlichen
und überlagerten Pointer-Definitionen in der Struktur-Definition), aber
etwas besseres kam bei den Überlegungen noch nicht raus.

Vielleicht hat ja noch jemand eine schicke Idee?

Grüße Uwe




Mehr Informationen über die Mailingliste Bralug