- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: char sprintf Probleme

  1. #1

    char sprintf Probleme

    Anzeige

    Praxistest und DIY Projekte
    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.

    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    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
    Strom fließt auch durch krumme Drähte !

  3. #3
    Hero_123
    Gast
    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

  4. #4
    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.

Ähnliche Themen

  1. Probleme mit LCD (HD44780) Wie sezt man einen ascii-char auf cursor pos ?
    Von fugitivus im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 23.04.2011, 11:14
  2. Befehl sprintf
    Von Achim S. im Forum Software, Algorithmen und KI
    Antworten: 10
    Letzter Beitrag: 21.04.2010, 18:20
  3. Probleme über Variabel-Addressierung auf Flash-Char
    Von Nicy im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.01.2009, 18:17
  4. RS232 P. Fleury Char und String Probleme mal wieder
    Von PCMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 31.10.2007, 15:52
  5. Laufschrift aktualisieren, Probleme mit char*
    Von PCMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 20.07.2007, 13:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test