[C/C++] Funktionszeiger

posi90

Erfahrenes Mitglied
Hallo,

Ich habe eine Frage bezüglich MVS2010 und Funktionszeiger, und zwar hab ich eine Fehlermeldung vom Syntaxhighlighter: Wert von "void(**)()" kann nicht zum Initialisieren einer Entität vom Typ "void(*)()" verwendet werden.

Da sich das Programm jedoch compilieren und fehlerfrei ausführen lässt, wollte ich fragen warum dieser Error auftaucht.

C++:
void f1() {printf("f1\n");}
void f2() {printf("f2\n");}

void run(void x())
{
	void (*f)() = &x;
	f();
}

int main()
{
	run(f1);
	run(f2);
	getchar();
	return 0;
}

Mein Ziel ist es eine beliebige Funktion an eine Klasse zu übergeben, welche dann in einer Schleife ausgeführt wird.

mfg. Poseidon
 
run() bekommt das x als Parameter. Hier wird eigentlich ein Zeiger auf die Funktion übergeben (ich bin es gewohnt das immer so zu schreiben, so wie du das machst kenne ich das gar nicht):

C++:
void run(void (*x)())

Ist aber im Prinzip dasselbe, nur es wird eben ein Zeiger auf die Funktion übergeben, deshalb darfst du in der Funktion kein & vor x setzen, du benötigst ja nicht die Adresse des Zeigers, sondern auf was der Zeiger zeigt (eben die Funktion).

Lg
 
Hi.
Ich habe eine Frage bezüglich MVS2010 und Funktionszeiger, und zwar hab ich eine Fehlermeldung vom Syntaxhighlighter: Wert von "void(**)()" kann nicht zum Initialisieren einer Entität vom Typ "void(*)()" verwendet werden.

Da sich das Programm jedoch compilieren und fehlerfrei ausführen lässt, wollte ich fragen warum dieser Error auftaucht.
Ganz einfach: die Typen passen nicht zusammen.

Den Parameter als "void x()" anzugeben ist ziemlich unüblich und nutzt eine selten genutzte Eigenheit des C Standard: bei der Deklaration eines Parameters vom Typ "Funktion mit Rückgabetyp R" wird dieser automatisch in "Zeiger auf Funktion mit Rückgabetyp R" umgewandelt. Deshalb ist der Typ von "&x" in Zeile 6 dann "Zeiger von Zeiger auf Funktion mit Rückgabetyp R".

Letztlich solltest du einfach die übliche Schreibweise "void (*x)()" verwenden und außerdem kannst du x dann auch einfach aufrufen - ohne den Umweg über f.

Man sollte solche impliziten Umwandlungen vermeiden. Mach es explizit - auch beim Aufruf: verwende die Schreibweise "run(&f1);" und nicht die automatische Umwandlung einer Funktion in einen Zeiger auf die Funktion.

Gruß
 
Danke euch beiden, so sieht es auch viel ordentlicher aus.

C++:
void f1() {printf("f1\n");}
void f2() {printf("f2\n");}

void run(void (*x)())
{
	x();
}

int main()
{
	run(&f1);
	run(&f2);
	getchar();
	return 0;
}
 
Zurück