Forum: Compiler & IDEs Allgemeiner Funktionspointer


von Philipp R. (Gast)


Lesenswert?

Hallo!

Ich wende mich mit einer Verständnisfrage an euch.
Habe irgendwann mal irgendwo gelesen, dass der Unterschied zwischen
1
void MeineFunktion(void)
2
{
3
  ...
4
5
  return;
6
}
und
1
void MeineFunktion()
2
{
3
  ...
4
5
  return;
6
}
der ist, dass bei
1
void MeineFunktion(void)
 überprüft wird, dass der Funktion keine(!) Parameter übergeben werden.

Im Umkehrschluss müsste es ja möglich sein die deklararierte & 
definierte Funktion:
1
void MeineFunktion()
 z.B. so aufzurufen:
1
MeineFunktion(1,2,3, &test);

Falls das möglich ist, kann ich dann in einen Funktionspointer des Typs:
1
void (*funcPtr)()
, jede belieben Funktionspointer hinterlegen, also auch eine Funktion, 
die Übergabeparameter hat?
Entscheidend ist hier für mich die Frage, ob ich dann bei 
Funktionsaufruf dennoch Parameter übergeben kann.

Bsp:
1
typedef void(*)() FuncPointer;
2
typedef void(*)(void) FuncPointerVoid;
3
4
FuncPointer funcPtr;
5
6
int main()
7
{
8
  funcPtr = (FuncPointer)&Addition;
9
  //FuncPointerVoid = (FuncPointerVoid)&Addition; /* dürfte nicht gehen, oder?? */ 
10
  Berechne(2,3);
11
12
  return 0;
13
}
14
15
void Addition(int a, int* b, int* c)
16
{
17
  *c = a + *b;
18
19
  return;
20
}
21
22
void Berechne(int a, int b)
23
{
24
  int result;
25
   
26
  funcPtr(a, &b, &result);
27
28
  printf("Ergebnis: %i", result);
29
30
  return;
31
}

Danke für die Hilfe.

Gruß
Philipp

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Im Prinzip ja, aber das ist nicht der empfohlene Weg.  Das ist
eigentlich nur noch historischer Ballast, um das C der 1970er Jahre
noch rudimentär zu unterstützen.  C++ hatte diesen historischen
Ballast nie, folglich ist dort
1
void foo(void);

identisch zu
1
void foo();

Der korrekte Weg für C wäre es, per typecast den passenden Typ hin
und her zu wandeln (Funktionszeiger sind untereinander zuweisungs-
kompatibel) und so dem Compiler auch tatsächlich mitzuteilen, wie
viele und welche Argumente die konkrete Funktion dann beim Aufruf
bekommen soll.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.