Forum: Mikrocontroller und Digitale Elektronik Funktionsdeklaration


von auBacke (Gast)


Lesenswert?

Hallo,

bitte um Hilfe:
Programmiere gerade einen Devicetreiber unter C für einen uC. Wie kann 
ich bitte in dem Headerfile die Funktion(en) des C-Files richtig 
deklarieren, wenn Parameter dieser Funktion Zeiger sind ?

Danke !

von Karl H. (kbuchegg)


Lesenswert?

Ganz normal, so wie man eben Zeiger deklariert.


header.h
********

void MyFunc( int* First, int* Secnd );


header.c
********

#include "header.h"

void MyFunc( int* First, int* Secnd )
{
  *First = 5;
  *Secnd = 7;
}

main.c
******

#include "header.h"

int main()
{
  int a, b;

  MyFunc( &a, &b );

  /* a hat jetzt den Wert 5, b den Wert 7 */

  return 0;
}

Steht in jedem noch so grindigem Lehrbuch über C drinnen.

von auBacke (Gast)


Lesenswert?

Hallo Karl Heinz,

jaja, zunächst mal Danke für Deine Antwort. Hatte einen Denkfehler, den 
ich einfach übersehen haben. Gefunden habe ich ihn heute morgen, bevor 
ich hier reingeschaut habe.
Ist mir schon klar, dass einfache Erklärungen in einem C-Buch stehen, 
aber s.o.
Zu Deiner Erklärung noch:
Es macht keinen Sinn Header.H in Header.C einzubinden. Funktionen in 
Header.H werden zudem als extern deklariert.
Man kann einfach hier nicht um Hilfe bitten ohne einen zugehörigen 
Spruch zu erhalten...
Grüße

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Es macht keinen Sinn Header.H in Header.C einzubinden.

O doch, so könnten dort auch Strukturen, Enums und irgendwelche 
Konstanten deklariert werden, die sowohl für "header.c" als auch für 
Aufrufer von Funktionen in "header.c" von Interesse sind.

> Funktionen in Header.H werden zudem als extern deklariert.

Das ist bei Funktionsprototypen implizit und kann daher entfallen.

Karl Heinz hat also -wie so oft- einfach nur recht.

von Karl heinz B. (kbucheg)


Lesenswert?

> > Es macht keinen Sinn Header.H in Header.C einzubinden.
>
> O doch, so könnten dort auch Strukturen, Enums und irgendwelche
> Konstanten deklariert werden, die sowohl für "header.c" als auch für
> Aufrufer von Funktionen in "header.c" von Interesse sind.

Ganz abgesehen davon, überprüft dann der Compiler, ob die
Funktionsdekleration (also der Prototyp) auch mit der
tatsächlichen Funktionsdefinition (also der Implementierung)
übereinstimmt.
Es soll schon vorgekommen sein, dass man eines von beiden
verändert und auf das andere vergisst. Wer also behauptet,
dass das keinen Sinn ergibt, hat noch nie seine Zeit damit
verbracht, simple Tippfehler stundenlang zu suchen. Man
nimmt vom Compiler jede Hilfe an, die man kriegen kann.

von Peter D. (peda)


Lesenswert?

Karl heinz Buchegger wrote:

> Ganz abgesehen davon, überprüft dann der Compiler, ob die
> Funktionsdekleration (also der Prototyp) auch mit der
> tatsächlichen Funktionsdefinition (also der Implementierung)
> übereinstimmt.


Genau so isses, das eigene *.h gehört selbstverständlich mit rein.

Der Linker macht ja keine Typüberprüfung mehr, er löst nur die Namen 
auf. Und findet er sie, ist er glücklich.


Peter

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

außerdem kann es ja sein das eine Funktion die in header.c implementiert 
ist eine andere Funktion verwendet die eben auch in header.c 
implementiert ist. Kommt die aufgerufene Funktion im Quelltext nach der 
aufrufenden kennt sie der Compiler nicht und meckert. Also gehört immer 
in ein header.c auch ein #include "header.h".

Matthias

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.