- Red Magic 11 Air – vékony házból süvít a szél
- Csíptetős fülesek csatája – Sony LinkBuds Clip vs. Huawei FreeClip 2
- Mérföldkő a szilárdtest-akkuknál: fontos lépést tett a QuantumScape
- Újabb óriásakku a Honortól: a X80 lehet a következő 10 000 mAh-s modell
- iPhone 18 Pro Max: kis kapacitásbővítés hoz nagy előrelépést üzemidőben
- Külföldi prepaid SIM-ek itthon
- Poco F8 Ultra – forrónaci
- iOS alkalmazások
- Milyen okostelefont vegyek?
- iPhone topik
- A korábbiaknál is varázslatosabb lesz a Honor Magic V6
- Honor Magic8 Pro - bevált recept kölcsönvett hozzávalókkal
- Xiaomi Mi 10T Pro - a házon belüli ellenfél
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Samsung Galaxy S10e - esszenciális
Új hozzászólás Aktív témák
-
stepboy
csendes tag
válasz
kpisti1990
#5734
üzenetére
A "while( 1 )" az végtelen ciklust jelent, mindig fut a kód amíg nem lépsz ki a ciklusból (például egy "break"-kel). A return-t el sem éri.
Amire gondolni tudok, hogy ez a ciklus a gépeden natívan fut, ergo nagyon gyors - az egyetlen hely ahol várakozik, az a billentyű lenyomása. Tehát amikor lenyomod a billentyűt, azt gyorsan kiértékeli és végig pörög a statemachine-en végül minden kezdődik elölről; de te még mindig ugyanazt a billentyűt nyomod, ezért úgy tűnik, mintha ismételné magát a program, pedig csak többször lefutott. Ez csak egy tipp, sajnos nem ismerem a stdio-t annyira, hogy megtudjam mondani valóban ez történik a te esetedben is.Úgyhogy, lehet hogy érdemes lenne valami lassítást rakni az állapotgépedbe:
- ALAP: ide nem kell, mert itt várakozik egy billentyű lenyomásra
- FIZETETT: ide valamilyen késleltető függvény, ami érzékelhetően feltartatja a programfutást (~1s kb.), tehát kiírja a szöveget, majd várakozik és utána lép a következő állapotba
- KESZ: itt ezt írod "-végén (ital elvételekor) álljon vissza alap állapotba", ebből nekem úgy tűnik, hogy valamilyen gombbal kell jelezni, hogy elvetted az italt, tehát az is billentyű beolvasás kell, hogy legyen.case FIZETETT:
{
printf( "valami szöveg\n" );
kesleltet_ms( 1000 );
state = KESZ;
break;
}A "kesleltet_ms()" pedig egy nagyon hosszú ciklus, ami a megadott milliszekundumnyi ideig várakozik:
void kesleltet_ms ( int ms )
{
while ( ms )
{
ms--;
for ( int c = 0; c < 65535; c++ )
{
/* ez itt ures */
}
}
}Ez egy nagyon kezdetleges megoldás, a belső "for" ciklust úgy kell tuningolni, hogy nagyjából 1 milliszekundum alatt érjen végig, szóval a c-t addig kell növelni.
Két nagyon fontos dolog:
- fordítás mindenféle optimalizáció nélkül (hogy biztosan benne legyen a lefordított kódban a ciklus és végig is menjen rendesen)
- a típusod olyan legyen, amibe a szám amit vizsgálni akarsz még elfér (tehát ha csak 16bites "int"-ed van, abba értelemszerűen 65535-nél nagyobb szám nem fér bele)Itt egy profibb megoldás: [The delay() Function]
A kilépésre meg azt javasolnám, hogy a while( 1 ) helyett legyen valami ilyesmi:
int bentmarad = 1;
while ( bentmarad )
{
switch ( state )
{
case ALAP:
{
printf( "szöveg\n" );
char c = getchar();
if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) || ( c != 'q' ) )
{
printf( "rossz billentyű\n" );
}
else if ( c == 'k' )
{
printf( "jó betű 1.\n" );
state = FIZETETT;
}
else if ( c == 't' )
{
printf( "jó betű 2.\n" );
state = FIZETETT;
}
else if ( c == 'q' )
{
printf( "viszlát\n" );
bentmarad = 0;
}
...Tehát egy külön billentyűvel megszakítod az egész ciklust - persze, ha a feladatkiírás ezt nem teszi lehetővé, akkor nem kell belerakni a végleges kódba.
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Kuponkunyeráló
- Lítium-ion/Li-ion akkumulátorok
- Milyen billentyűzetet vegyek?
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Egyéni arckép 2. lépés: ARCKÉPSZERKESZTŐ
- Filmvilág
- Abarth, Alfa Romeo, Fiat, Lancia topik
- PlayStation 5
- Luck Dragon: Asszociációs játék. :)
- További aktív témák...
- -ÚJ- 2x8GB 3600MHz Apacer NOX hűtőbordás DDR4 kitek! GAR/SZÁMLA (a Te nevedre kiállítva)!
- Kingston HyperX Fury Beast 2x8GB 3200MHz DDR4 kit / Beszámítás OK!
- G.SKILL Ripjaws V 2x4GB 3000MHz DDR4 kit
- Dell Latitude 7480 használt laptop eladó
- ASUS ROG Falchion (HU) 65%-os mechanikus billentyűzet (LUBED + TAPED + DUMPED)
- REFURBISHED - DELL Performance Dock WD19DCS (210-AZBN)
- HIBÁTLAN iPhone 15 Pro Max 256GB Natural Titanium-1 ÉV GARANCIA - Kártyafüggetlen, MS4231
- Keresünk iPhone 12/ 12 Mini/ 12 Pro/12 Pro Max
- BESZÁMÍTÁS! LENOVO ThinkPad P15 Gen 1 munkaállomás - i7 10750H 16GB DDR4 256GB SSD Quadro T1000 W11
- Telefon felvásárlás!! Apple iPhone 16, Apple iPhone 16e, Apple iPhone 16 Plus, Apple iPhone 16 Pro
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest


