mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rückgabeproblem


Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe in einem Test.c eine Funktion
uint16_t Calc_Duty (uint16_t Duty)
{
  uint16_t Temp;
  Temp = 1000-Duty;
  Temp = Temp * 1.6;

  return Temp;

}


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

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

ich bekomme die Fehlermeldung:
../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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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


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


Ich blick grad nicht mehr durch

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu musst du den Header einbinden.

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

Autor: Tommy (Gast)
Datum:

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

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gregor B. (gregor54321)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef LM75_H_
#define LM75_H_

#include "twi.h"

unsigned char LM75_GetOnBoardTemperature(float *temp,signed char *ctemp);

#endif /*LM75_H_*/

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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Murkser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.