Allgemeiner Funktionspointer

Gast #2093641
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
Moderator Persönliche Seite #2093756
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.