Funktionspointer

TimSz

Mitglied
Hi

Mein Programm sieht etwa so aus:
Code:
#include <stdio.h>
void test(char chr)
{
	printf("test %c", chr);
	return;
}

void main ()
{
	void (*test1)(char);
	void (*test2)(char);
	void (*test3)(char);
	test1 = (&test);
	test2=test;
	test3=*test;
	printf("%d\r\n", test1);
	test1('a');
	return;
}
Die Funktion mit dem Pointern funktioniert problemlos.

In der Zeile printf("%d\r\n", test1); gibt er mir anscheinend auch wie erwartet die Adresse der Funktion auf.
Nun möchte ich jedoch wissen, welches Byte am Anfang der Funktion steht.
Bei normalen Pointern könnte ich mir also statt "test1" also "*test1" ausgeben; ich erhalte jedoch stattdessen immer wieder nur die Adresse der Funktion.

Gruß

Tim
 
Hi.

Naja, also ich meine was versprichst du denn dir davon? Was soll deiner Meinung nach das erste Byte auf das der Funktionspointer zeigt für einen Sinn/Wert haben?

Man kann keine Funktionspointer dereferenzieren.

Aber, man kann natürlich wild umher-casten:
Code:
printf ("%d\n", (int)*(char*)test1);

In C/C++ muß der Rückgabetyp der Funktion main int sein.
http://de.wikibooks.org/wiki/C-Programmierung:_FAQ hat gesagt.:
Hier nur ein unvollständige Liste der populärsten Irrtümer:

* Ein Programm beginnt mit void main(void) , main() usw. - Dies entspricht nicht dem (C99) Standard. Dort ist festgelegt, dass jedes Programm (sofern im keine Parameter übergeben werde) mit int main() oder int main(void) beginnen muss. Die Definition mit void main() bzw. void main(void) ist kein gültiges C, da der Standard vorschreibt, dass main einen Rückgabewert vom Typ int besitzen muss (auch wenn viele Compilerdiese void dennoch akzeptieren). Die Definiton mit main() war früher gültig, da beim Fehlen eines Rückgabetyps angenommen wurde, dass die Funktion int zurückliefert.
 
Hi,

Dein "umher-casten" scheint zu funktionieren; mich hat einfach interessiert, wie das so funktioniert.

Danke auch für den Tipp mit dem void/int; leider gibt Visual C++ nicht einmal eine Warnung aus.

Gruß

Tim
 
Hallo,
Danke auch für den Tipp mit dem void/int; leider gibt Visual C++ nicht einmal eine Warnung aus.
solltest du nicht dem Compiler die Schuld an deinem schlechten Programmierstil geben.
ich glaube das war auch nicht des Posters Absicht, er hat es lediglich bedauert
das ihm der Compiler des VSs nicht drauf hin gewiesen hat...

P.S. Wenn man das mit dem Rückgabewert nicht oder falsch gelernt bekommt
deutet das noch lange nicht auf schlechtne Programmierstil hin.
Gruß

RedWing
 
Zuletzt bearbeitet:
RedWing hat gesagt.:
P.S. Wenn man das mit dem Rückgabewert nicht oder falsch gelernt bekommt
deutet das noch lange nicht auf schlechtne Programmierstil hin.
<klugscheisser-modus: an>
es muss natürlich korrekt heißen: "gelehrt" und nicht "gelernt"... :-)
<klugscheisser-modus: aus>
 
Zurück