Variable als Funktionsname

Hi
Ist es in C möglich, einen Funktionsnamen über eine Variable anzugeben? Dass ich bei der Deklaration also nicht schreibe void name_der_funktion() sondern void variable() und variable enthält dann "name_der_funktion".
Hintergrund ist folgender: Ich erzeuge mit Gtk mehrere Buttons nach dem Prinzip Button erzeugen => Callbackfunktion für den Button definieren => Button in Box packen => Button anzeigen. Um den Code zu verkürzen möchte ich eine Funktion schreiben, die mir das alles abnimmt, also: GtkWidget create_button(char label[], char callback[], char box[]).
Beim Callback definieren muss ich ja den Funktionsnamen angeben, der aber variabel sein sol. Daher möchte ich lieber eine Variable angeben statt eines festen Funktionsnamen.

Gruß
Cage
 
Nein das ist definitiv nicht moeglich, denn zur Zeit des Kompelierens muss der Name bekannt sein, was du aber machen kannst ist:
Du schreibst ein Programm und uebergibst den Namen einfach als Parameter.
Ich kenne mich mit GUI-programmierung unter C nicht so aus aber ich nehme mal an es ist aehnlich wie in JAVA.
Also
void fester_name_der_funktion/methode(int welcher_parameter,char** die_parameter)
oder du schreibst ein mainmodul welches dich nach dem Namen fragt und das alles dann an eine Methode weitergibt.
mfg


sw33t
 
hm, statt des Namens vielleicht ein Pointer?
Code:
#include <stdio.h>
#include <stdlib.h>

void funktion1 ()
{
  printf("hallo");
}
void funktion2 ()
{
  printf("was moechtet Ihr von mir?");
}

int main(int argc, char *argv[])
{

  void (*myfunction)(void);

  if (argc>1) myfunction=funktion2;
  else myfunction=funktion1;
  myfunction();


  return 0;
}
dann könntest Du immer noch funktionsnamen als Parameter übergeben.
EDIT:
habs ein wenig umgekrempelt, vielleicht ist es so verständlicher:
Code:
#include <stdio.h>
#include <stdlib.h>

void funktion1 ()
{
  printf("hallo");
}
void funktion2 ()
{
  printf("was moechtet Ihr von mir?");
}

void create_console(char *output,void (*callback)(void))
{
	printf(output);
	callback();
}

int main(int argc, char *argv[])
{



  if (argc>1) create_console("Parameter entdeckt\n",funktion1);
  else create_console("keine Parameter, weniger Arbeit\n",funktion2);



  return 0;
}
bitte Nachsichtig mit dem Code sein - ich mag kein C ;)
 
Das geht.*rofl*
Das ist aber ganz abgefahren, jedoch genial.
Nur so, von wegen, ich und effektiv,d.h. ich weiss nur was ich auch brauche(o.k. dumme ausrede fuer mich faulen Sack aber sie zieht manchmal):
Gibt es einen Grund, performance oder so, das du dem Problem von vorne durch den Ruecken ins Auge schiesst, oder wolltest du nur angeben :D, weil der Name einer Methode innerhalb eines komplierten Programmes ist doch eigentlich total egal, es sei den man laesst gdb oder so rueberlaufen.
mfg

sw33t
 
Meintet ihr das so in etwa?

Code:
GtkWidget *button;
GtkWidget *qbox;
static GtkWidget create_button(char label[], char callback[], char box[])
	{
	
	void (*function)(void);
	function = callback;
	
	button = gtk_button_new_with_label(label);					// Button erzeugen
	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(function), NULL);	// Callbackfunktion angeben
	gtk_box_pack_start(GTK_BOX(qbox), button, TRUE, FALSE, 0);			// Button in Box
	gtk_widget_show(button);							// Button anzeigen
	}

static void test()
	{
	g_print("test123");
	}
Aufgerufen wir die Funktion dann mit create_button("test", "test", "qbox");

Der Button wird zwar erzeugt, aber wenn ich draufklicke stürzt das Programm ab. In der Konsole erscheint die Meldung "Segmentation fault (core dumped)". Beim Kompilieren gibt es die Warnung "Zuweisung von inkompatiblem Zeigertyp" (Zeile 40, d.h. bei function = callback; ).
Wenn ich function = callback; mache, müsste callback doch schon eine Funktion und kein String sein, oder? Womit ich dann wieder beim alten Problem wäre, wie krieg ich den String als Funktionsnamen?
 
ich habe meinen oberen Beitrag editiert, ich denke, das sollte verständlicher sein.
also
Code:
static GtkWidget create_button(char label[], void(*callback)(void), char box[])
Chararray zu casten bringt ja nichts ;).Du musst schon die Funktionsadresse übergeben, bzw wird es der Compiler selber erledigen, wenn man
Code:
create_button("nix",funktion1,"nix")
aufruft.
 
Klappt! Vielen Dank!
Falls sich irgendjemand für den Code intressiert:

Code:
static GtkWidget create_button(char label[], void callback(void), GtkWidget *box, char data[])
	{
	
	void (*function)(void);
	function = callback;	
	
	button = gtk_button_new_with_label(label);					// Button erzeugen
	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(function), data);	// Callbackfunktion angeben
	gtk_box_pack_start(GTK_BOX(box), button, TRUE, FALSE, 0);			// Button in Box
	gtk_widget_show(button);							// Button anzeigen
	
	}
Beispielaufruf:
Code:
// Quit Button
create_button("Quit", quit, qbox, NULL);

Gruß
Cage
 
Zurück
Oben