mikrocontroller.net

Forum: Compiler & IDEs Allgemeiner Funktionspointer


Autor: Philipp R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich wende mich mit einer Verständnisfrage an euch.
Habe irgendwann mal irgendwo gelesen, dass der Unterschied zwischen
void MeineFunktion(void)
{
  ...

  return;
}
und
void MeineFunktion()
{
  ...

  return;
}
der ist, dass bei
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:
void MeineFunktion()
 z.B. so aufzurufen:
MeineFunktion(1,2,3, &test);

Falls das möglich ist, kann ich dann in einen Funktionspointer des Typs:
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:
typedef void(*)() FuncPointer;
typedef void(*)(void) FuncPointerVoid;

FuncPointer funcPtr;

int main()
{
  funcPtr = (FuncPointer)&Addition;
  //FuncPointerVoid = (FuncPointerVoid)&Addition; /* dürfte nicht gehen, oder?? */ 
  Berechne(2,3);

  return 0;
}

void Addition(int a, int* b, int* c)
{
  *c = a + *b;

  return;
}

void Berechne(int a, int b)
{
  int result;
   
  funcPtr(a, &b, &result);

  printf("Ergebnis: %i", result);

  return;
}

Danke für die Hilfe.

Gruß
Philipp

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
void foo(void);

identisch zu
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.