Forum: Mikrocontroller und Digitale Elektronik Rückgabeproblem


von Tommy (Gast)


Lesenswert?

Hi,

ich habe in einem Test.c eine Funktion
1
uint16_t Calc_Duty (uint16_t Duty)
2
{
3
  uint16_t Temp;
4
  Temp = 1000-Duty;
5
  Temp = Temp * 1.6;
6
7
  return Temp;
8
9
}

in dieser Funktionen.c deklariere ich die obige Funktion:
1
uint16_t Calc_Duty (uint16_t Duty);

in der dazugehörigen Funktionen.h dann noch:
1
extern uint16_t Calc_Duty (uint16_t Duty);

ich bekomme die Fehlermeldung:
1
../Funktionen.h:11: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Calc_Duty'

aber warum? Vergessen habe ich nichts, hab ich schon tausenmal 
überprüft. Ich denke ich mache einen anderen Fehler, aber ich seh ihn 
grad nicht.


Wer kann helfen?

Tommy

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tommy schrieb:
> in dieser Funktionen.c deklariere ich die obige Funktion:

Was soll das da?

Tommy schrieb:
> in der dazugehörigen Funktionen.h dann noch:

Das Schlüsselwort extern kannst Du bei einem Funktionsprototyp 
weglassen, das ist implizit.

von Tommy (Gast)


Lesenswert?

Zusätzlich habe ich, wenn ich die Funktion aufrufe:
1
return Calc_Duty(500);

die Warnung:

../main.c:51: warning: 'return' with a value, in function returning void


Aber ich habe den Rückgabewert doch mit uint16_t angegeben!


Ich blick grad nicht mehr durch

von Tommy (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Was soll das da?

Damit ich nicht die Warnung "implicit declaration..." bekomme, wenn ich 
die
Funktion aus einer anderen *.c aufrufe

von Daniel V. (danvet)


Lesenswert?

Dazu musst du den Header einbinden.

Ach ja, kompletter Code wäre vorteilhaft...

von Tommy (Gast)


Lesenswert?

Mein C-File heist natürlich Funktionen.c und nicht wie in der ersten 
Zeile Test.c, sorry.

von Tommy (Gast)


Lesenswert?

Daniel V. schrieb:
> Dazu musst du den Header einbinden.

Wenn ich den Header einmal in meine Funktion.c und in die main.c 
include, dann deklariere ich die Funktion doppelt und führt auch wieder 
zu Fehlern.

Bei "normalen" Funktionen ohne Rückgabewert funktioniert das super.

von Daniel V. (danvet)


Lesenswert?

Tommy schrieb:
> Daniel V. schrieb:
>> Dazu musst du den Header einbinden.
>
> Wenn ich den Header einmal in meine Funktion.c und in die main.c
> include, dann deklariere ich die Funktion doppelt und führt auch wieder
> zu Fehlern.
>
> Bei "normalen" Funktionen ohne Rückgabewert funktioniert das super.

Wie gesagt: Poste den kompletten Code, sonst kann man nur raten.

von Gregor B. (gregor54321)


Lesenswert?

uint16_t wird nicht interpretiert --->

#include <stdint.h>


In der funktionen.c darf die Prototypendeklaration kein weiteres mal 
erfolgen. nur die funktionen.h in die funktionen.c inkludieren und in 
der .h mittels 'extern' der prototypen deklarieren.

von Daniel V. (danvet)


Lesenswert?

Gregor B. schrieb:
> uint16_t wird nicht interpretiert --->
>
> #include <stdint.h>
>
>
> In der funktionen.c darf die Prototypendeklaration kein weiteres mal
> erfolgen. nur die funktionen.h in die funktionen.c inkludieren und in
> der .h mittels 'extern' der prototypen deklarieren.

Extern ist wie schon gesagt wurde nicht notwendig.
In der Regel sollte ein Header so aussehen:
1
#ifndef LM75_H_
2
#define LM75_H_
3
4
#include "twi.h"
5
6
unsigned char LM75_GetOnBoardTemperature(float *temp,signed char *ctemp);
7
8
#endif /*LM75_H_*/

Der Header wird mit einem "ifndef" gekapselt. Falls er schon mal 
aufgerufen wurde, wird er kein zweites Mal aufgerufen.

von Gerhard (Gast)


Lesenswert?

Tommy schrieb:
> Wenn ich den Header einmal in meine Funktion.c und in die main.c
> include, dann deklariere ich die Funktion doppelt und führt auch wieder
> zu Fehlern.

Du musst in der Header-Datei mit #ifndef etc. arbeiten, ansonsten 
bekommst du diesen Fehler.

z.B.

#ifndef Funktion_h
#define Funktion_h

Deklarationen ....


#endif

von Murkser (Gast)


Lesenswert?

Hallo,

> Zusätzlich habe ich, wenn ich die Funktion aufrufe:
>
> return Calc_Duty(500);
>
> die Warnung:
>
> ../main.c:51: warning: 'return' with a value, in function returning void

Dies deutet darauf hin, dass Du die main Funktion als "void main..." 
deklariert hast (ist laut C Standard bei bare-metal Systemen in 
Ordnung), aber dann kannst Du keinen Rueckgabewert mit "return ..." 
zurueckgeben, sondern nur ein "einfaches" return (ohne Wert) machen.

Was soll eigentlich die Multiplikation mit einem floating-point Wert 1.6 
in Deiner Funktion? Du rechnest sonst nur mit 16-bit Integern, das ist 
ein bisschen unschoen...

Murkser

von Tommy (Gast)


Lesenswert?

OK, danke erstmal.

Gregor B. schrieb:
> uint16_t wird nicht interpretiert --->
>
> #include <stdint.h>
>
>
> In der funktionen.c darf die Prototypendeklaration kein weiteres mal
> erfolgen. nur die funktionen.h in die funktionen.c inkludieren und in
> der .h mittels 'extern' der prototypen deklarieren.
>
>
>     Beitrag melden | Bearbeiten | Löschen |

Das war der Fehler.

Mit dem abkapseln von Headern habe ich mich noch nicht beschäftigt, bis 
jetzt klappte es immer prima wenn man sorgfältig arbeitet und 
überschaubar progammiert.

Trotzdem danke für die Hilfe.



Tommy

von Daniel V. (danvet)


Lesenswert?

Tommy schrieb:

>
> Mit dem abkapseln von Headern habe ich mich noch nicht beschäftigt, bis
> jetzt klappte es immer prima wenn man sorgfältig arbeitet und
> überschaubar progammiert.
>
> Trotzdem danke für die Hilfe.
>
>
>
> Tommy

So gesehen kannst du dir dann die Headers auch sparen und ganz 
weglassen.

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.