Falscher Rückgabewert bei float Rückgabe

Gast #3122334
Lesenswert?
• ▲
▼
Hallo,
ich habe das Problem, dass meine Funktion sobald ein float oder double 
Wert zurückgegeben wird falsche Werte liefert.
1
int main(void)
2
{
3
  float temperatur;
4

5
  temperatur = read_temperature();
6
}
7

8
float read_temperature(uint8_t id)
9
{
10
  //do something
11
  temperatur *= 0.0625;
12
  return temperatur
13
}
Das liefert mir eine Temperatur 16807.

Änder ich das ganze zu bekomme ich die richtigen Werte...
1
int main(void)
2
{
3
  float temperatur;
4
  uint16_t buffer;
5

6
  buffer = read_temperature();
7
  temperatur = buffer*0.0625;
8
}
9

10
uint16_t read_temperature(uint8_t id)
11
{
12
  //do something
13
  return temperatur
14
}

Vielen Dank für eure Hilfe!
Gast #3122343
Lesenswert?
• ▲
▼
Kann auch gerne die Funktion posten, dachte es ist so übersichtlicher.
1
float ow_read_temperature(uint8_t id)
2
{
3
  uint8_t i;
4
  uint8_t scratchpad[9]; //datenpuffer für auslesen des scratchpads
5
  float temperatur;
6
  
7
  // Start mit Master-Reset-Impuls u. Abfrage: Slave presence
8
  if(ow_reset())
9
  {
10
    return 0;
11
  }
12
  
13
  //Slave anwählen
14
  ow_match(id);
15
  
16
  // Abfrage-Befehl senden: "READ SCRATCHPAD" = 0xBE
17
  ow_wr_byte(0xbe);
18

19
  for (i=0; i<9; i++)
20
  {
21
    scratchpad[i] = ow_rd_byte();
22
  }
23
  
24
  if((scratchpad[1] & 0xF8) == 0x00) //Wenn sign bit == 0 -> positive temperatur
25
  {
26
    temperatur = ((scratchpad[1]<<8)+scratchpad[0]);
27
    temperatur *= 0.0625;
28
    return temperatur;
29
  }
30
  else
31
  {
32
    return 0; //Fehler
33
  }
Gast #3122353
Lesenswert?
• ▲
▼
Jetzt funktioniert es. "Umdrehen" ging zwar nicht da in anderer c-Datei, 
ein extern float ow_read_temperature(uint8_t id) hat aber geholfen. 
Blöder Fehler.
Kann mir jetzt aber einer erklären warum es bei einem uint16_t 
Rückgabewert trotzdem funktioniert bei einem float jedoch nicht?
#3122361
Lesenswert?
• ▲
▼
Klaus schrieb:
> Jetzt funktioniert es. "Umdrehen" ging zwar nicht da in anderer c-Datei,
> ein extern float ow_read_temperature(uint8_t id) hat aber geholfen.
> Blöder Fehler.
> Kann mir jetzt aber einer erklären warum es bei einem uint16_t
> Rückgabewert trotzdem funktioniert bei einem float jedoch nicht?

Weil der Compiler bei allem was er nicht kennt Standardannahmen trifft. 
Und die lauten in deinem Fall:

Eine Funktion von der nichts bekannt ist, liefert einen int zurück.

Wenn das das komplette Programm ist
1
int main()
2
{
3
  double j;
4

5
  j = cos( 0.5 );
6
}

dann weiß der Compiler an dieser Stelle nichts von einer Funktion namens 
'cos'. Also gelten Standardannahmen. Zwei davon sind
* da du ein Argument benutzt und dieses Argument (0.5) den Datentyp 
double hat, vertrau ich meinem Progrtammierer und die Funktion cos wird 
angenommen als eine Funktion, die genau 1 Argument nimmt und dieses muss 
double sein
* da über den Datentyp des Returnwertes nichts bekannt ist, wird 
angenommen, dass die Funktion einen int zurückliefert.

Jetzt ...
1
double cos( double angle );
2

3
int main()
4
{
5
  double j;
6

7
  j = cos( 0.5 );
8
}
... sieht die Sache anders aus. Jetzt informiert der Prototyp der 
Funktion den Compiler darüber, wie sich die Sache mit der Funktion 'cos' 
wirklich verhält.

Steht denn diese 'implizit-int' Regel in den heutigen C-Büchern nicht 
mher drinnen? Dabei ist sie samt den Promotion Regeln so dermassen 
wichtig. Wie will man den anders verstehen, wie sich die 
Argumentübergabe bei variadischen Funktionen verhält? Oder hast du gar 
kein C-Buch? Gefährlich!

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.