Befehl sprintf



  • Hallo Freunde
    Habe in einem Code den Befehl sprintf gefunden. Habe auch versucht diesen teil einzutippen. Komme aber damit nicht klar. Der Code geht nicht so wie er soll. Mache also einen Fehler. Versthe auch nicht den sinn dieses Befehles. Schaut mal drüber, ist nicht lang.

    bot_update();
    float volt = 0.0166 * bot_supply - 1.19;
    sprintf (text, "%3.1fV", (double)volt);
    gfx_move(25, 0);
    gfx_print_text(text);

    Die Spannung soll auf eibnem kleinen Display angezeigt werden. Das Studio4 läuft mit sprintf und printf. Die gemessene Spannung wird aber nicht angezeigt, sondern es erscheint ein "?" auf dem Schirm. Komme nicht mit was ich falsch mache.
    Achim



  • sprintf() ist eine Funktion aus der Standard-Bibliothek von C. Versuchs mal so:

    #include <stdio.h>
    
    int main(void)
    {
        char text[32];
    
        sprintf(text, "%3.1fV", 1.0/9.0);
        puts(text);
    
        return 0;
    }
    

    Wenn's so geht, liegts wohl an deiner Ausgabe. Der Cast nach double ist btw nicht nötig, weil sowieso jedes float nach double konvertiert wird, wenn man damit rechnet oder es übergibt.
    🙂



  • Hallo
    Habe deinen Code eingetragen, leider ohne erfolg. Es erfolgt wieder keine Anzeige der Spannung. Habe mal den teil kopiert. Die Anzeige ist wichtig, da es nur auf einem kleinen Display angezeigt wird. Die include sind alle drin, habe sie hier aber nicht aufgeführt. Wenn ich den sprintf richtig lese, wird
    "%3.1fV", (double)ubatt) in der Variablen Text gespeichert und anschließend an der Stelle ausgegeben. Hatte schon überlegt ob ich mir nicht vorher den wert von ubatt anzeigen lasse um zu sehen wo der Fehler steckt.

    bot_update();
    char text [32];
    float ubatt = 0.0166 * bot_supply - 1.19;

    sprintf(text, "%3.1fV", (double)ubatt);
    gfx_move(25, 0);
    gfx_set_proportional(1);
    gfx_print_text("Batterie :");
    gfx_set_proportional(1);
    gfx_print_text(text);

    Achim



  • achim S. schrieb:

    Habe deinen Code eingetragen, leider ohne erfolg.

    Warum den Cast nicht entfernen?

    Wenn du mit der Sprache nicht gut zurecht kommst, empfiehlt sich die Verwendung eines Standard-C-Compilers, damit du alle Sprach-Probleme im ANSI-Forum nachfragen kannst. Um die Dokumentation deines Systems wirst du aber ohnehin nicht herumkommen.

    Vielleicht ist bot_supply ein NaN-Wert und vielleicht werden NaN-Werte als ? ausgegeben. Solche Dinge weiss aber sicher die Dokumentation.

    Ein Standard-C-Programm, das 1.2V ausgibt kann man zB so schreiben:

    #include <stdio.h>
    
    int main(void)
    {
        char text[32];
        float bot_supply = 142.0;
        float ubatt = 0.0166 * bot_supply - 1.19;
    
        sprintf(text, "%3.1fV", ubatt);
        puts(text);
    
        return 0;
    }
    

    🙂



  • *teehol*

    achim S. schrieb:

    Wenn ich den sprintf richtig lese, wird
    "%3.1fV", (double)ubatt) in der Variablen Text gespeichert und anschließend an der Stelle ausgegeben. Hatte schon überlegt ob ich mir nicht vorher den wert von ubatt anzeigen lasse um zu sehen wo der Fehler steckt.

    text sind eigentlich 32 Variablen, und zwar Zeichen-Variablen (Bytes). Man nennt sowas ein Array, das hat die Eigenschaft, dass die 32 Dinger hintereinander im Speicher angeordnet werden. Arrays von Zeichen verwendet man in C gerne als Zeichenketten (character strings). sprintf() markiert das Ende des benutzten Bereichs mit einem Byte, das (als Zahl) Null ist.

    Wenn du schlau bist, sagst du uns, was für ein Gerät du da programmieren willst, vielleicht kennt das zufällig jemand. Wird denn wenigstens der Text "Batterie" angezeigt?
    🙂



  • Mit dem Wert ubatt soll die Battereispannung ständig gemessen werden. Diese verändert sich doch ständig. Also keinen festen wert. Es geht eine Spannung auf einen Eingang von IC und dieser wird ständig abgefragt. Kann daher nicht mit einem festen wert arbeiten. Da ich mit Studio4 arbeite und das orignal Code auch damit geschrieben ist, muss es doch gehen. Wie kann ich mir float ubatt anzeigen lassen?
    Achim



  • achim S. schrieb:

    Wie kann ich mir float ubatt anzeigen lassen?

    Woher soll ich das wissen, wenn du nichtmal testen willst, ob dein Problem an der Ausgabe oder an der Stringformatierung liegt...?
    🙂



  • Es ist ein kleiner Rob vom Typ Nibo 2. Bin dabei einige Programme auszuprobeiren. Dabei will ich mir die Anzeige der Betribsspannung extra nehmen um z.B. in andere Programme zu schreiben. Und dabei bin ich über den Befehl sprintf gestolpert und wollte ihn ausprobieren. Leider ohne erfolg. Alles andere geht nur das Teil nicht.
    Achim



  • achim S. schrieb:

    Alles andere geht nur das Teil nicht.

    Und wenn du (natürlich nur zum Testen) stattdessen einen im Voraus bekannten String ausgibst? Und wenn du eine im Voraus bekannte Zahl an sprintf() übergibst?
    🙂


Log in to reply