PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : char sprintf Probleme



I_-_I---c
09.11.2013, 15:51
Hallo,

ich hab ein Cast Problem mit char und sprintf.
Das Problem liegt sicher in der Definition der Funktion oder wie ich das char[] zurückgebe.



char zeit(volatile unsigned long int zs)
{
char zeitstring[5];

uint16_t tag = floor(zs / 86400);
uint8_t stunde = floor((zs - (tag * 86400)) / 3600);
uint8_t minute = floor((zs - (tag * 86400) - (stunde * 3600)) / 60);
//uint8_t sekunde = floor(zs - (tag * 86400) - (stunde * 3600) - (minute * 60));

if(minute < 10 && stunde < 10) {
sprintf(zeitstring, "0%d:0%d", stunde, minute);
}
else if(stunde < 10) {
sprintf(zeitstring, "0%d:%d", stunde, minute);
}
else if(minute < 10) {
sprintf(zeitstring, "%d:0%d", stunde, minute);
}
else {
sprintf(zeitstring, "%d:%d", stunde, minute);
}

return zeitstring;
}


Ich bekomme auch 2 Warnungen. Aber bin auch durch rumprobieren nicht weiter gekommen.

warning: return makes integer from pointer without a cast
warning: function returns address of local variable

____

Die Funktion wird benutzt um die Zeit auf ein Display auszugeben. Da kommen aber nur krumme Zeichen.

Ich hoffe ihr könnt helfen.
Danke

Klebwax
09.11.2013, 17:44
Auf welche Zeile sich deine Warnungen beziehen, hättest du noch angeben können.

Deine Zeitangabe wird 5 Zeichen lang, dein Zeitstring hat aber keinen Platz mehr für das Nullbyte, also eins länger machen.

Wozu floor()? Du rechnest mit ints, da macht floor() keinen Sinn und da wird eine der Warnings herkommen.

Und wozu die uint16 und uint8, nimm einfach ints. Dann gibts auch keine Warnings bei sprintf(), das erwartet ints.

Und zur Ausgabe. Probiert mal statt der vielen ifs "%02d:%02d" als Formatstring.

Ob deine Rechnung richtig ist, habe ich nicht geprüft. (tag * 86400) und (stunde * 3600) sehen problematisch aus. Da kann ein Integer overflow auftreten.

MfG Klebwax

PS. ich finde keinen cast.

- - - Aktualisiert - - -

Irgenwie sieht mir das nach Unix-Time aus. Schau doch mal bei asctime() und friends, ob es da nicht schon etwas fertiges gibt.

MfG Klebwax

Hero_123
09.11.2013, 20:05
Hallo

Du musst bei der Funktion schreiben:

0.) #include <math.h> (hast Du bestimmt gemacht)

1.) char * zeit(volatile unsigned long int zs) {......} (=> du gibst ja einen Char-string zurück)

2.) in der Funktion definierst du die Variable char zeitspring[5] als static (normale Variable wird nach Verlassen der Fkt "zerstört", static nicht)



ALSO:

#include <math.h>
char * zeit(volatile unsigned long int zs)
{
static char zeitstring[5];
uint16_t tag = floor(zs / 86400);
.....
.....
sprintf(zeitstring, "%d:%d", stunde, minute);
}
return zeitstring;
}

mfg

Hero_123

I_-_I---c
10.11.2013, 13:36
Auf welche Zeile sich deine Warnungen beziehen, hättest du noch angeben können.

Dachte das wäre verständlich. Bezieht sich auf die Zeile:

return zeitstring;


Wozu floor()? Du rechnest mit ints, da macht floor() keinen Sinn und da wird eine der Warnings herkommen.

Stimmt:) Ich wusste nicht, ob die rechnung stimmt und habe es erst in php Programmiert. Und da braucht man es eben.
Und ne kein Warning von hier :)


Und wozu die uint16 und uint8, nimm einfach ints. Dann gibts auch keine Warnings bei sprintf(), das erwartet ints.

Na ganz einfach. Warum sollte ich unnötig irgendeinen Platz im Speicher reservieren.
uint8_t geht von 0 - 255 bei der rechnung reicht das.
Außer bei den Tagen, da kann uint16_t von 0 - 65535 was 179 Jahren entspricht. Was reichen sollte.
Und nein sprintf gibt da keine Warnings.


Und zur Ausgabe. Probiert mal statt der vielen ifs "%02d:%02d" als Formatstring.

Danke !


Ob deine Rechnung richtig ist, habe ich nicht geprüft. (tag * 86400) und (stunde * 3600) sehen problematisch aus. Da kann ein Integer overflow auftreten.

-----

Irgenwie sieht mir das nach Unix-Time aus.

Denke nicht dass es ein overflow gibt.
Durch die Rechnung kann Stunde nie höher als 24 sein, Minute < 60 Sekunde < 60
Und bei den Tagen wäre es erst bei 65535 ein Problem, was 179 Jahre entspricht. Es sollte reichen:)
Nicht direkt Unix. Timestamp 0 wird der Tag sein, an dem die Platine fertig war ;)

_______________________________


0.) #include <math.h>

Jap :) Aber nicht mehr benötigt, weil floor ja weg fällt.


1.) char * zeit(volatile unsigned long int zs) {......}

Danke! Das hat mein Problem gelößt


2.) in der Funktion definierst du die Variable char zeitspring[5] als static (normale Variable wird nach Verlassen der Fkt "zerstört", static nicht)

Stimmt. Spart sicher nochmal etwas zeit.

_____
Danke. Jetzt geht alles.