- Luck Dragon: Asszociációs játék. :)
- M0ng00se: Hardvert áruhitelre?
- sziku69: Szólánc.
- sziku69: Fűzzük össze a szavakat :)
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- eBay-es kütyük kis pénzért
- Rap, Hip-hop 90'
- Brogyi: CTEK akkumulátor töltő és másolatai
- bitpork: MOD Júni 13 Augusztus 2- szombat jelen állás szerint.
- btz: Internet fejlesztés országosan!
Új hozzászólás Aktív témák
-
stepboy
csendes tag
válasz
kpisti1990 #5741 üzenetére
hát windows.h-val csak windows-on működik a kód, de jó nyomon jársz.
-
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.
-
stepboy
csendes tag
válasz
kpisti1990 #5732 üzenetére
Így már jobban látom a kódod.
Miért van két "getchar()" ?Igen, úgy értettem, hogy csak akkor adhatsz a "state" változónak új értéket, ha a beolvasott karakter megfelelő, valahogy így:
while ( 1 )
{
switch ( state )
{
case ALAP:
{
printf( "szöveg\n" );
char c = getchar();
if ( ( c != 'k' ) || ( c != 't' ) || ( c != 'c' ) )
{
printf( "rossz betű\n" );
}
else if ( c == 'k' )
{
printf( "jó betű 1.\n" );
state = FIZETETT;
}
else if ( c == 't' )
{
printf( "jó betű 2.\n" );
state = FIZETETT;
}
else
{
printf( "jó betű 3.\n" );
state = FIZETETT;
}
break;
}
case FIZETETT:
{
printf( "valami szöveg\n" );
state = KESZ;
break;
}
case KESZ:
{
printf( "megint szöveg\n" );
state = ALAP;
break;
}
}
}Ez nem egy szép kód, de kezdetnek megteszi.
-
stepboy
csendes tag
válasz
kpisti1990 #5730 üzenetére
hahó;
a switch-el a "state" változó értékét vizsgálod, ezért ha az állapotgépet léptetni akarod, akkor annak kell egy új értéket adni.
valahogy így:{
switch(state)
case ALAP:
...
state = FIZETETT;
break;
case FIZETETT:
...
state = KESZ;
break;
case KESZ:
...
state = ALAP;
break;
}Persze ez csak egy váz. A "state" értéke mindig attól függ, hogy a következő állapotba lépés engedélyezett-e; például az "ALAP" értéknél, csak a megfelelő karakter beolvasása után lehet "FIZETETT" érték, de remélem, hogy a lényeg megvan!
Ha még nem olvastad, akkor hasznos: [Állapotgépek]
Legközelebb használd a "Programkód" formázást, hogy olvasható legyen a kód amit beírsz.
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Bluetooth hangszórók
- Kerékpárosok, bringások ide!
- Linux kezdőknek
- Windows 98/ME kérdések és válaszok
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- AMD Catalyst™ driverek topikja
- Milyen belső merevlemezt vegyek?
- Kertészet, mezőgazdaság topik
- További aktív témák...
- Csere-Beszámítás! Custom vizes számítógép játékra! I7 12700KF / RTX 3090 / 32GB DDR5 / 1TB SSD
- Sigma 150-600mm f/5-6.3 DG OS HSM C ( Canon ) -Újszerű-
- Dell Latitude 7410 Strapabíró Ütésálló Profi Ultrabook Laptop 14" -80% i7-10610U 16/512 FHD IPS MATT
- Új MSI KATANA 15 Gamer Tervező Laptop 15,6" -35% i7-13620H 10Mag 16/1TB RTX 4060 8GB FHD 144Hz
- HP Omen - 27" IPS - UHD 4K - 144Hz 1ms - NVIDIA G-Sync - FreeSync - HDR 400 - USB-C - KVM Switch
- BESZÁMÍTÁS! GIGABYTE AORUS MASTER RTX 3070 8GB GDDR6 videokártya garanciával hibátlan működéssel
- MacBook Air 15 M3 8 / 256GB dobozos 12 hónap garancia
- Bomba ár! HP ZBook FireFly G8 - i7 I 16GB I 512SSD I 15,6" FHD Touch I Nvidia 4GB I Cam I W11 I Gar!
- Eredeti Lenovo USB-C 65W töltő
- ÁRGARANCIA! Épített KomPhone Ryzen 7 9800X3D 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest