pelzfrucht
Goto Top

Ladebalken in C bewegt sich erst bei 100 prozent

Moin,

Ich habe in C einen Pseude Ladebalken erstellt:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

void fortschritt(int, int);

int main(void) {
    setlocale(LC_ALL, "de_DE");  
    int durchlauf = 0;
    
    printf("\n\n\n");  
    
    for (durchlauf = 0; durchlauf <= 1000000; durchlauf++)
        fortschritt(durchlauf, 1000000);
    
    printf("\n\n\n");  
    
}

void fortschritt(int fortschritt, int gesamt) {
    float prozent = (fortschritt / gesamt) * 100;
    int for1 = 0, for2 = 0;
    
    
    printf("\r%03.2f%% [", prozent);  
    
    for (for1 = 0; for1 <= prozent/2; for1++) {
        printf("=");  
    }
    
    for (for2 = 0; for2 <= (prozent/2-for1); for2++) {
        printf(" ");  
    }
    
    printf("]");  
    fflush(stdout);
    
}


Wenn ich das Programm ausführe, zeigt er die ganze Zeit nur 0.00 % an.
bildschirmfoto 2016-07-27 um 04.51.31

Erst wenn die Schleife komplett durch ist, regt sich der Balken:

bildschirmfoto 2016-07-27 um 04.51.34

Dabei wird bei jedem Funktionsaufruf eigentlich der Prozenzsatz neu berechnet und der Ladebalken neu gedruckt.
Jemand eine Idee warum sich das ganze erst regt wenns schon zu Ende ist?

Vielen Dank im Vorraus!
Viele Grüße
pelzfrucht

PS: Das mit der for Schleife zum Zeitvertreib ist zwar sehr unsexy, aber es erfüllt seinen Zweck und braucht 3-4 Sekunden auf meinem Computer.

Content-ID: 310970

Url: https://administrator.de/contentid/310970

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

NativeMode
Lösung NativeMode 27.07.2016 um 08:00:20 Uhr
Goto Top
Ändere mal Zeile 22 in
float prozent = ((float)fortschritt / (float)gesamt) * 100;

Hier musst du explizit einen Type cast machen, sonst funktioniert die Umrechung von int in float nicht.

Gruß
pelzfrucht
pelzfrucht 27.07.2016 um 08:43:43 Uhr
Goto Top
Zitat von @NativeMode:

Ändere mal Zeile 22 in
float prozent = ((float)fortschritt / (float)gesamt) * 100;

Hier musst du explizit einen Type cast machen, sonst funktioniert die Umrechung von int in float nicht.

Gruß

Das wars! Danke face-smile

Hab die Bedingung der zweiten Schleife in der fortschritt Funktion noch angepasst, jetzt wird auch das hintere " ] " an seiner richtigen stelle angezeigt.

void fortschritt(int fortschritt, int gesamt) {
    float prozent = ((float)fortschritt / (float)gesamt) * 100;
    int for1 = 0, for2 = 0;
    
    
    printf("\r%03.2f%% [", prozent);  
    
    for (for1 = 0; for1 <= prozent/2; for1++) {
        printf("=");  
    }
    
    for (for2 = 0; for2 <= (50-for1); for2++) {
        printf(" ");  
    }
    
    printf("]");  
    fflush(stdout);

Eine Frage noch:
printf("\r%03.2f%% [", prozent);  
erzeugt z.B. die Ausgabe
9,28% [=...
Müsste durch das %03.2f nicht eigentlich bis 3 Nullen vorangestellt werden, also theoretisch das hier dort stehen:
009,28% [=...

Mit %d bzw. %i (Integer) Zahlen kann ich so jedenfalls eine variable Anzahl an Nullen auffüllen vorm Komma.
Warum funktioniert das nicht bei den anderen Variablen Platzhaltern (%f) ?

Viele Grüße
pelzfrucht
NativeMode
Lösung NativeMode 27.07.2016 um 09:04:15 Uhr
Goto Top
%3.2f Bedeutet mindestens 3 Stellen für das gesamte Feld, davon 2 Nachkommastellen (eine für den Punkt). Wenn du also 3 Vorkommastellen haben willst die mit Nullen gefüllt werden musst du schreiben %06.2f.

Gruß