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
-
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).
#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:
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.
-
Co takhle vynutit výstup použitím flush? Viz. např. http://www.cplusplus.com/reference/iostream/ostream/flush/
-
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)
-
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 :-)
-
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.
-
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.
-
Díky! Funguje to.
K+
-
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:
std::cout << "Ahoj";
Toto nepoužívejte... dejte si pod includy řádek:
using namespace std;
a všude pak můžete std:: vynechat
Dále pak třeba toto:
if(!(i==2))
Doporučuji psát takto:
if ( i != 2 )
-
[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):
CONFORMING TO
C89, C99, POSIX.1-2001. POSIX requires that CLOCKS_PER_SEC equals 1000000 independent of the actual resolution.
-
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.
-
CLOCK_PER_SECS funguje ve Windows i v Linuxu ale vytěžuje to procesor. Sleep ho nevytěžuje, ale ve Windows to nefunguje.
-
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.
-
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?