Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: YaD 10 Října 2010, 11:39:28

Název: C++, problém s výstupom za použitia ctime [vyřešeno]
Přispěvatel: YaD 10 Října 2010, 11:39:28
Spravil som si jednoduchý kód, ktorý ráta bodky a potom ich zmaže. Vo win to funguje podľa očakávania, ale na Ubuntu 10.04 má problémy s výstupom. Kód začne pracovať a po malom momente sa vypíše celý výstup, resp. za behu nič nevypíše (čo by mal).

Kód: [Vybrat]
#include <iostream>
#include <ctime>

void zmazBodky()
{
    std::cout << "\b\b\b   \b\b\b";
}

void pockajSekundu()
{
    clock_t cakaj = 1 * CLOCKS_PER_SEC;
    clock_t start = clock();
    while(clock() < cakaj + start)
        ;
}

void bodky()
{
    for(int i = 0; i <= 2; i++)
    {
        pockajSekundu();
        std::cout << ".";
    }
}

int main(int argc, char* argv[])
{
    std::cout << "Ahoj";

    for(int i = 0; i <= 2; i++)
    {
        bodky();
        pockajSekundu();
        if(!(i==2))
            zmazBodky();
    }

    std::cout << std::endl << "Pre ukoncienie stlace enter";
    std::cin.get();

    return 0;

}

Rád by som Vás poprosil o radu kde je chyba. Ďakujem.

P.S.
Možno to pomôže:
Kód: [Vybrat]
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: mka 10 Října 2010, 12:53:13
Co takhle vynutit výstup použitím flush? Viz. např. http://www.cplusplus.com/reference/iostream/ostream/flush/
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: petergula 10 Října 2010, 14:11:12
Len fakticka, co tak pouzivat sleep miesto brutalneho checkovania v prazdnom cykle? http://linux.die.net/man/3/sleep (http://linux.die.net/man/3/sleep)
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: mka 10 Října 2010, 14:26:31
Len fakticka, co tak pouzivat sleep miesto brutalneho checkovania v prazdnom cykle? http://linux.die.net/man/3/sleep (http://linux.die.net/man/3/sleep)
Jo, je to sice trochu OT, ale souhlas. A krom sleepu tu máme ještě usleep :-)
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: YaD 10 Října 2010, 14:27:56
To mka: Pokiaľ správne rozumiem, tak by mal flush, vždy vypísať obsah bufferu, resp. obsah toho súboru. Pokiaľ je to tak, mám niekde problém, kedže mi to nedáva žiadny výstup okrem toho súboru, ktorý musím čítať ručne ($ cat test.txt).

To petergula: Díky za radu. :) V C++ začínam, takže nemám taký rozhľad.
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: mka 10 Října 2010, 15:12:06
Pokud chceš okamžitě zobrazit výstup. tak po každém výstupu musíš použít flush. Jinak se výstup realizuje buď po zaplnění výst. bufferu nebo po ukončení řádku nebo např. programu.
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: YaD 10 Října 2010, 15:35:43
Díky! Funguje to.

K+
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: Martin - ViPEr*CZ* 10 Října 2010, 15:39:56
Zajmavý je, že zrovna na stránkách co poslal mka ohledně metody flush... je ona ctime třída... kde zrovna uvádějí právě jako sample onen while cyklus:

http://www.cplusplus.com/reference/clibrary/ctime/clock/

PS:

Kód: [Vybrat]
std::cout << "Ahoj";Toto nepoužívejte... dejte si pod includy řádek:

Kód: [Vybrat]
using namespace std;
a všude pak můžete std:: vynechat

Dále pak třeba toto:

Kód: [Vybrat]
if(!(i==2))
Doporučuji psát takto:

Kód: [Vybrat]
if ( i != 2 )
Název: Re: C++, problém s výstupom za použitia ctime
Přispěvatel: mka 10 Října 2010, 16:27:53
Kód: [Vybrat]
[quote author=Martin - ViPEr*CZ* link=topic=50818.msg366252#msg366252 date=1286717996]
Zajmavý je, že zrovna na stránkách co poslal mka ohledně metody flush... je ona ctime třída... kde zrovna uvádějí právě jako sample onen while cyklus:

http://www.cplusplus.com/reference/clibrary/ctime/clock/
( i != 2 )
[/quote]

Jojo, jako ilustrační příklad je to nepochybně dobrý. Ale pro běžnou praxi jsou sleep a usleep zřejmě mnohem vhodnější :-)

P.S.
Krom toho to s tím CLOCKS_PER_SEC není až zase tak jednoznačný, viz man clock(3):
Citace
CONFORMING TO
       C89,  C99,  POSIX.1-2001.   POSIX  requires  that CLOCKS_PER_SEC equals 1000000 independent of the actual resolution.
Název: Re: C++, problém s výstupom za použitia ctime [vyřešeno]
Přispěvatel: YaD 10 Října 2010, 19:48:20
To Martin - ViPEr*CZ*:
To std:: používam skôr pre prehľadnosť, aby som vedel, kde je aký kód, či môj alebo z knižníc (C++, kedže C nemá takéto prefixy, myslím...).
EDIT: Keď už, tak používam skôr using std::cout a pod. ;)
To !(i == 2) je už zlozvyk, aj keď viem, že používať i != 2 by bolo lepšie.
   ---   ---   ---   ---
Ešte k tomu unistd.h, tu budem mať trošku problém, kedže testujem programy pod win v MS VS C++ 2010 Express. Ale s tým sa pohrám asi v minGW alebo tu knižnicu nejako prilinkujem.
Název: Re: C++, problém s výstupom za použitia ctime [vyřešeno]
Přispěvatel: Firzen 10 Října 2010, 20:13:33
CLOCK_PER_SECS funguje ve Windows i v Linuxu ale vytěžuje to procesor. Sleep ho nevytěžuje, ale ve Windows to nefunguje.
Název: Re: C++, problém s výstupom za použitia ctime [vyřešeno]
Přispěvatel: YaD 10 Října 2010, 21:08:24
To ma trošku štve, kedže pridať tam knižnice je dosť problematické, závislosti sú ako reťaz a minGW ju v sebe nemá. Takže prenositeľnosť kódu je vážne problém. Preto by som sa rád spýtal či existuje nejaké kompilátor s knižnicami pre obidve platformy?
g++, integrovaný vo VS, minGW majú rozdielne knižnice.
Název: Re: C++, problém s výstupom za použitia ctime [vyřešeno]
Přispěvatel: mka 10 Října 2010, 23:03:44
CLOCK_PER_SECS funguje ve Windows i v Linuxu ale vytěžuje to procesor. Sleep ho nevytěžuje, ale ve Windows to nefunguje.
Ono ve widlích něco funguje?