ganz grob: zu erst wird die funktion deklariert. 3 beispiele:
Code:
void funktionsname(void){verschiedene aktionen};
// diese funktion gibt keinen wert zurück (Beispiel MotorDir();) und benötigt keine werte (Beispiel Init();).

int funktionsname(char wert){verschiedene aktionen; return x;}
//diese funktion gibt einen integer zurück (beispiel PollSwitch) und braucht einen wert um zu arbeiten (beispiel FrontLed();)

char funktionsname(char wert1, char wert2){verschiedene aktionen; return x}
//diese funktion gibt einen wert zurück und braucht zwei werte (Beispiel MotorSpeed();)
anstelle von "verschiedene aktionen" steht der eigentliche inhalt der funktion. hier dürfen dei übegebenen werte (in den beispielen wert, wert1, wert2) verwendet werden. bei funktionen mit rückgabe muss ein wert mit return zurückgegeben werden, dieser kann dann so verarbeitet werden wie zB der Wert von PollSwitch.

um die funktion dann aufzurufen, geht folgendes:
Code:
//funktion mit rückgabe, aber ohne übergabe:
variable = funktionsname();

//funktion ohne rückgabe, aber mit übergabe:
funktionsname(a,b);

//funktion mit rückgabe und mit übergabe:
variable = funktionsname(a);
ein komplettes beispiel: wir wollen zwei zahlen addieren. die zahlen werden übergeben und das ergebnis zurückgegeben:

Code:
//funktionsdeklaration:
int addieren(wert1, wert2){
  int ergebnis = 0;
  ergebnis = wert1 + wert2;
  return ergebnis;
}

//jetzt ist die funktion definiert und darf in der main-funktion aufgerufen werden. dazu muss sie ÜBER der main funktion im quelltext stehen.

[...]
erstersummand = 4;
zweitersummand = 8;
summe = addieren(erstersummand, zweitersummand);
[...]
jetzt enthält "summe" den von addieren() zurückgegebenen wert.