Dá se nějak udělat blikací text v C++? Možná to zní jako hovadina, ale mně by se to hodilo :o)
Fórum › C / C++
Blikání
ahoj me to zaujalo a i kdyz sem ted zacal a louskam 4. lekci udelal sem neco z toho co uz umim :) urcite to pujde udelat lepe:
-------------------------------------------------------------------------------------------------------------------------------------------------
#include <iostream>
using namespace std;
int main()
{
char tx1[6]="POZOR";
char tx2[7]=" ";
int t=100000000; //nastavi rychlost blikani nastaveni pro p4 2,1MHz
//protoze sem u 4 lekce a nehledal sem zatim zpusob jak casovat . casovani je jen tak aby fungovalo a musi se nastavit pro kazdy pocitac individualne
//staci nahradit spravnym zpusobem a bude blikani casovane spravne nezavisle na rychlosti pocitace :)
for (int q=0; q<500; q++)
{
cout << tx1[0] << tx1[1] << tx1[2] << tx1[3] << tx1[4] ;
for (int w=0; w<t; w++)
tx2[6]=2*2;
cout << "\b\b\b\b\b" << tx2[0] << tx2[1] << tx2[2] << tx2[3] << tx2[4] << "\b\b\b\b\b";
for (w=0; w<t; w++)
tx2[6]=2*2; //tady sem do charu navic ulozil neco co ma poc delat aby se pri cekani nenudil . pripadalo mi to trosku lepsi nez kdyby tam nebylo nic :)
}
cin.get();
cin.get();
return 0;
}
To ereg: Lol, při čekání nenudil :D Ale solidní nápad :) Až bude chvíle času napíšu objektové řešení...
EDIT:
#include <iostream>
using namespace std;
class Text
{
public:
Text(){}
~Text(){}
void Vypis(char * text);
void Smaz(char * text);
void Cekej();
void Blikej(char * ttext);
private:
char * Text1;
char * Text2;
};
void Text::Vypis(char * text)
{
Text1 = text;
cout << Text1;
}
void Text::Smaz(char * text)
{
Text2 = "\b\b\b\b\b\b \b\b\b\b\b\b";
cout << Text2;
}
void Text::Cekej()
{
for (int i=0; i<100000000; i++){}
}
void Text::Blikej(char * ttext)
{
Text t1;
for(int i = 0; i<10; i++)
{
t1.Vypis(ttext);
t1.Cekej();
t1.Smaz(ttext);
t1.Cekej();
}
}
int main()
{
Text T;
T.Blikej("AHOOOJ");
cin.get();
return 0;
}
To midin: moc dík.
Tak tohle je prasecina. Takhle muzes inicializovat jen promenne v konstruktoru(a to stejne budou konstatni), to ze to nespadlo hned, byla jen souhra nahod.
.....
private:
char * Text1;
char * Text2;
};
void Text::Vypis(char * text)
{
Text1 = text;
cout << Text1;
}
void Text::Smaz(char * text)
{
Text2 = "\b\b\b\b\b\b \b\b\b\b\b\b";
cout << Text2;
}
Tohle taky postrada smysl, pokud volas nejake metody tridy z jine metody te same tridy, tak nemusis vytvaret instanci.
Staci zavolat metodu jako klasickou funkci, kompilator pozna, co ma zavolat, a kdyby se mu neco nelibilo, tak se pouziva this->.
void Text::Blikej(char * ttext)
{
Text t1;
for(int i = 0; i<10; i++)
{
t1.Vypis(ttext);
t1.Cekej();
t1.Smaz(ttext);
t1.Cekej();
}
}
To ereg: Já bejt tebou bych se moc nevychvaloval, protože tohle je pěknej nesmysl int t=100000000;. Inteber má rozsah se znaménkem -32768 až +32767 a bez znaménka 65536, čili by to přeteklo. Navíc v druhým cyklu nemáš w vůbec deklarovaný.
Podařilo se mi udělat blikací text v borland c++ 3.1 pomocí textattr(0xA6), ale to mi je na dvě věci.
Jinak z toho int t=100000000 nemůže být stack overflow?
To filip186:
To nemuze, stack overflow, je totiz uplne neco jineho, co se maximalne muze stat u typu int je preteceni jeho rozsahu. Jinak kdyz uz se tu bavite o rozsahu, tak ten je urcen poctem bitu a ten zavisi na tom, na jake architekture bezi ten program. Pokud je to 32-bit, tak velikost intu bude 32b(4B) a z toho plyne, ze rozsah bude <0,(2^32)-1> u unsigned, signed potom <-2miliardy, +2miliardy>, pokud 64b(8B) tak...
matrix: mno :) sem se nevychvaloval protoze samochvala smrdi.
ovsem ze jsem deklaroval W dvakrat protoze podle lekce3 ma byt w deklarovany uvnitr cyklu for platny pouze v tom cyklu.
ovsem pokud si muj priklad zkusis, tak aspon v Mvisual C++ zjistis ze byses dopustil "error C2374: 'w' : redefinition; multiple initialization"
coz mne trochu prekvapilo. ale nemohu posoudit jestli na to nema vliv ze je to vse uzavrene v bloku hlavniho cyklu. ale jsem rad ze ses o tom zninil
pokud by mi nekdo tohle osvetlil budu jen rad.
jeste bych rad dodal ze casovani pomoci cyklu bych doopravdy v programu nerad pouzil ( ted to bylo jen z duvodu me neznalosti)
a tedy t=100000000 a 2*2 byl jak midin pochopil spravne vtipek a jen nejnutnejsi konstrukce aby priklad byl funkcni
v lekci 3 se u cyklu while dokonce o tomto autor zminuje ze je lepsi zpusob. ( doufam ze v nektere z dalsich lekci bude vysvetleno)
taky by mne zajimalo jak se casovani resi lepe
To Jura: Tvořeno ve stavu polospánku a ještě s nijak valnými znalostmi :) Při drtivé většině případů se nezhroutí :)
To ereg:
pokud by mi nekdo tohle osvetlil budu jen rad.
Ano, proměnná w funguje pouze v bloku příkazů pro for (poté jí compiler "přestane znát").
autor zminuje ze je lepsi zpusob. ( doufam ze v nektere z dalsich lekci bude vysvetleno)
Nebude :) A vůbec bych neřekl, že je to lepší způsob.
taky by mne zajimalo jak se casovani resi lepe
Header <ctime>. Prozkoumej.
Takže oprava (pro spokojenost všech):
#include <iostream>
using namespace std;
class Text
{
public:
Text(){Text2 = "\b\b\b\b\b\b \b\b\b\b\b\b";}
~Text(){}
void Vypis(char * text);
void Smaz(char * text);
void Cekej();
void Blikej(char * ttext);
private:
char * Text2;
};
void Text::Vypis(char * text)
{
cout << text;
}
void Text::Smaz(char * text)
{
cout << Text2;
}
void Text::Cekej()
{
for (double i=0; i<100000000; i++){}
}
void Text::Blikej(char * ttext)
{
for(int i = 0; i<10; i++)
{
Vypis(ttext);
Cekej();
Smaz(ttext);
Cekej();
}
}
int main()
{
Text T;
T.Blikej("AHOOOJ");
cin.get();
return 0;
}
midin píše:#
# To ereg: #
##pokud by mi nekdo tohle osvetlil budu jen rad.
#Ano, proměnná w funguje pouze v bloku příkazů pro for (poté jí compiler "přestane znát").#
#
myslel sem blok prikazu patricich k for q ale vnem jsou dva for w a myslel sem ze by mely to byt samostatne bloky s extra deklaraci pro druhe for w.ale MV mi to nedovoli deklarovat 2x
proc teda je deklarovane for w i pro druhy for w jeste z prvniho for w ?
#autor zminuje ze je lepsi zpusob. ( doufam ze v nektere z dalsich lekci bude vysvetleno)
#Nebude :) A vůbec bych neřekl, že je to lepší způsob.#
#
myslel sem tim ze tohle je spatny zpusob casovani . jinak cituji autora lekce3 :
"Díky while můžeme vytvořit časovou prodlevu :
long cekej=0;
while (cekej < 10000)
cekej++; // počítá potichu
Problém nastává, že na každém PC je jiný procesor a tudíž jiná rychlost :(
Proto se používá jiný (lepší) způsob, ale o něm později ;) "
To ereg:
for (int w=0; w<t; w++)
tx2[6]=2*2; // TADY KONCI BLOK PRIKAZU PRO PRVNI W (W POTE PRESTANE EXISTOVAT (PRO NEKTERY KOMPILERY)
cout << "\b\b\b\b\b" << tx2[0] << tx2[1] << tx2[2] << tx2[3] << tx2[4] << "\b\b\b\b\b";
for (w=0; w<t; w++) // NEKTERE KOMPILERY NEPOZNAJI ZE PREDTIM NEJAKE W EXISTOVALO, ZADNE PRO NE NEEXISTUJE
tx2[6]=2*2;
Vidíš to, tady pracuje každý kompiler jinak. MS se to líbí, ale třeba takový mingw to nesnese.
používá jiný (lepší) způsob, ale o něm později ;)
Ach tak, tak myslím, že o <ctime> bude řeč. Klidně si vezmi náskok a něco o něm si vygoogli.
Ano, proměnná w funguje pouze v bloku příkazů pro for (poté jí compiler "přestane znát").
Visual, že by standartně nejel podle ANSI/ISO?
mam VS c++ 6.0 SP6
a potvrzuji pokud mame kod:
for(int i;...){}
for(int i;...){}//zde program zarve, multiple redefinition bo co, proste to i zna i mimo prvni cyklus for
tak sem se na deklaraci (w) jeste jednou dival
a vypada to ze opravdu pokud je definice promenne (w) pro cyklus udelana v bloku jineho cyklu ( napr q), tak je deklarovana promenna platna az do konce bloku (q) pak uz ji MV6 nezna
pro mne je dulezite ze jde o problem kompileru a tedy kompiler si sam rekne jak to chce deklarovat :)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Blikani grafiky v C# — založil alois
Překreslování formuláře - blikání — založil Pebble
Těžké začátky s ATMega8 a blikání LED — založil DragonSoul
Blikání ikony běžící aplikace na hlavním panelu v D XE2 — založil Borisek
Moderátoři diskuze