Ausgabe nur für bestimmte Zeit



  • Hallo zusammen

    Erstmal vorweg: Ich habe noch nicht so viel Erfahrung mit dem C++ programmieren. Ich habe zwar an der Uni einen Kurs dazu besucht, da wurden aber nur die absoluten Grundlagen erklärt und das liegt auch schon über ein halbes Jahr zurück.

    Zum Problem: Folgendes habe ich programmiert:

    #include <cstdlib>
     #include <iostream>
    
     int main()
    
     {
       //Anzahl Zahlen, die ausgegeben werden sollen
        std::cout<<"n=?";
        unsigned int n;
        std::cin>>n;
    
        //Zufallsgenerator "ansähen" :-)
        srand((unsigned)time(0)); 
    
        //Initialisieren eines Arrays mit n Zufallszahlen
        unsigned int *randomarray=new  unsigned int [n];
        for(unsigned int i=0;i<n;++i)
          { 
    	int random_integer = rand()%100+10;
    	randomarray[i]=random_integer;
          }
    
        //hier möchte ich alle Zahlen aus randomarray ausgeben und zwar für 1 Sekunde. Danach soll die Zahl wieder verschwinden.
    
        for (unsigned int i=0; i<n;++i)
          {
    	std::cout<< randomarray [i];
          }
    
        delete [] randomarray;
    
     }
    

    Ich möchte, dass an der angezeigten Stelle die Zahl zwar ausgegeben wird, aber nur für kurze Zeit. Danach soll sie wieder verschwinden. Leider habe ich keine Ahnung wie ich das bewerkstelligen soll und hoffe nun auf Unterstützung von euch.



  • Okay, erstmal: Zahlen oder Zahl?
    Wenn du das Array Dumpen willst, dann geht das so:

    Erstmal oben die Header <ctime> und <algorithm> einbinden.

    Dann füge bei dir ein:

    std::copy(random,                                      //Von *random (inklusive)
              random + n,                                  //Bis random[n] (exklusive)
              std::ostream_iterator<unsigned int>(std::cout, ", "));//Ausgeben, mit ", " getrennt
    

    Dann wirds lustig. Eine Zeit lang warten kann man auf ganz unterschiedliche Arten machen:

    Mit C++11:

    std::this_thread::sleep_for(std::chrono::seconds(1));
    

    Mit der WinAPI: (braucht Header <Windows.h> bzw. <windows.h>

    Sleep(1000);//In Millisekunden
    

    Mit Boost, auch wenn ich darauf jetzt keine Lust habe, und mit den C-Standardbibliotheks-Funktionen:

    {
        clock_t t = clock();
        while(clock() - t < CLOCKS_PER_SEC);//Nicht schön!
    }
    

    Dann wieder löschen, das geht mit einem Trick:

    for(short a = 0;a < 1000;++a)
        std::cout << "\b \b";
    

    Ich kann mich erinnern, dass das auch noch eleganter ging mit dem Löschen, irgendso eine Funktion.... Kann mich aber nicht mehr erinnern.



  • Hallo Sone

    Merci vielmals für die schnelle Antwort. Leider funktioniert bei mir das Ganze nicht wirklich. Ich habe also folgenden Code:

    #include <cstdlib>
     #include <iostream>
    
     int main()
    
     {
       //Anzahl Zahlen, die ausgegeben werden sollen
        std::cout<<"n=?";
        unsigned int n;
        std::cin>>n;
    
        //Zufallsgenerator "ansähen" :-)
        srand((unsigned)time(0)); 
        unsigned int *randomarray=new  unsigned int [n];
    
        //Initialisieren eines Arrays mit n Zufallszahlen
        for(unsigned int i=0;i<n;++i)
          { 
    	int random_integer = rand()%100+10;
    	randomarray[i]=random_integer;
          }
    
        //Alle Zahlen sollen ausgegeben werden und danach wieder verschwinden
    
         std::copy(randomarray, randomarray + n, std::ostream_iterator<unsigned int>(std::cout, ", "));
    
        {
          clock_t t = clock();
          while(clock() - t < CLOCKS_PER_SEC);//Nicht schön!
        }
    
        for(short a = 0;a < 1000;++a)
        std::cout << "\b \b";
    
        delete [] randomarray;
    
     }
    

    Wenn ich das Program laufen lasse, dann mag der Compiler schon die Ausgabe des Arrays nicht. Er meint: 'ostream_iterator' is not a member of 'std' und expected primary expression before 'unsigned'.
    Wenn ich das aber ersetze mit meiner Schlaufenvariante (siehe erster Beitrag) dann gibt es bei der Ausgabe zwar eine Sekunde Pause, aber nichts verschwindet, wenn ich das Program in der Konsole aufrufe. Was ist da falsch?



  • Du musst noch <algorithm> und <iterator> einbinden!

    Das funktioniert:

    #include <algorithm>
    #include <ctime>
    #include <iostream>
    #include <iterator>
    
     int main()
    
     {
        unsigned int n;
        std::cin>>n;
    
        srand(time(0));
        unsigned int *randomarray=new  unsigned int [n];
    
        for(unsigned int i=0;i<n;++i)
            randomarray[i] = rand()%100+10;
    
         std::copy(randomarray, randomarray + n, std::ostream_iterator<unsigned int>(std::cout, ", "));
    
        {
          clock_t t = clock();
          while(clock() - t < CLOCKS_PER_SEC);//Nicht schön!
        }
    
        for(short a = 0;a < 1000;++a)
            std::cout << "\b \b";
    
        delete [] randomarray;
     }
    


  • Ok. Merci. Ich habe mal deinen Code so kopiert und laufen lassen. Das Problem ist jetzt, dass die Zahlen gar nie erscheinen. Nachdem ich die Länge des Arrays (n) eingetippt habe, gibt es einfach eine Sekunde Pause und dann ist der Spuk vorbei...



  • Rungo schrieb:

    Ok. Merci. Ich habe mal deinen Code so kopiert und laufen lassen. Das Problem ist jetzt, dass die Zahlen gar nie erscheinen. Nachdem ich die Länge des Arrays (n) eingetippt habe, gibt es einfach eine Sekunde Pause und dann ist der Spuk vorbei...

    ???
    Bei mir funktioniert das wunderbar.
    Welche Zahl gibst du ein?



  • @Rungo: probiers mal mit

    std::cout.flush();
    

    in Zeile 19, also nach std::copy...



  • Dobi schrieb:

    @Rungo: probiers mal mit

    std::cout.flush();
    

    in Zeile 19, also nach std::copy...

    Oh ja, daran könnte es liegen.



  • Hallo Sone, hallo Dobi

    Super! Klappt alles wunderbar. Vielen Dank für die superschnelle und tolle Hilfe!

    Liebe Grüsse
    Rungo


Anmelden zum Antworten