Rückgabeproblem

Gast #2012968
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
Gast #2012977
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
#2013018
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.
Gast #2013021
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
Gast #2013026
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
Gast #2013045
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren