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!