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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.