- Honor Magic V5 - méret a kamera mögött
- Sony Xperia 1 VII - Látod-e, esteledik
- Mindenki Z Fold7-et akar
- Minden a BlackBerry telefonokról és rendszerről
- Szuperkijelzővel készül a Huawei Mate 80 RS
- Android alkalmazások - szoftver kibeszélő topik
- Samsung Galaxy S24 FE - később
- Új Trónok Harca telefon érkezik
- Milyen okostelefont vegyek?
- Yettel topik
Hirdetés
-
Mobilarena
Új hozzászólás Aktív témák
-
-
Jester01
veterán
Emitter kollega fentebb pont wav fájlokat töltöget be, igaz c-ben.
Mindenesetre a wav file elején egy header van amibõl ki lehet olvasni a paramétereket.
Utána az adatok jönnek, minden mintavételi idõponthoz az összes csatorna egymás után.
Tehát pl. 16 bites 2 csatornás wav adatrészébõl úgy csinálsz 1 csatornát, hogy 2 byteot megtartasz és a következõ kettõt eldobod, sít. Értelemszerûen a fejlécben pedig átírod a csatornák számát 1-re. (Hozzáteszem, hogy a wavban nem csak tömörítetlen adatfolyam lehet, de gondolom a feladatban ezt feltételezheted.)
Aztán hogy ezt hogyan lehet beletuszkolni egy OO programnyelvbe azt sajnos nem tudom. -
Jester01
veterán
válasz
emitter #1537 üzenetére
Valami telepítési gubanc lehet nálad, ha nincs doksi.
info libc ''waiting for i/o'' vagy online itt: [link]
A select nem eszik procit. Arra kell vigyázni, hogy a hang lejátszás ne blokkolja a vezérlést. Igy hasraütésre nekem az egy adatfolyam beágyazott vezérlõjelekkel szimpatikusabb, talán kevesebb baj van vele. -
Jester01
veterán
-
Jester01
veterán
válasz
emitter #1512 üzenetére
Mivel a te wavod a kiírás szerint csak 10676 byte így persze, hogy nem kell a ciklus hiszen egy bufferbe belefér
Próbáld egy nagyobb fájllal.
Az snd_pcm_writei visszatérési értéke csak akkor hiba, ha kisebb mint 0. Egyébként a kiírt keretek számát adja vissza. Gondolom teljesen szabályos, ha alkalomadtán kevesebbet ír ki mint amennyit beadtál, ilyenkor feltehetõleg ciklusban újra kell próbálni. De olvasd el a doksit ezügyben.
Vszg azért kapsz segmentation fault-ot, mert többet íratsz ki a bufferbõl mint amekkora a mérete. Most már én is kezdek belezavarodni (persze én nem néztem utána), hogy minta (sample) vagy keret (frame) számot kell neki megadni. -
Jester01
veterán
válasz
Jester01 #1507 üzenetére
Múködik szépen.
Az snd_pcm_writei kereteket (frame) ír, vagyis oda feleakkora szám kell mint ahány minta (sample) van mert 2 csatornát használsz. Ha ezután sem jó, akkor ellenõrizd, hogy a teszt wav tényleg 44.1kHz (ez nem fontos, legfeljebb gyorsabb-lassabb lesz), stereo S16LE (ez fontos) formátumú:
> file t.wav
t.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz -
Jester01
veterán
válasz
emitter #1506 üzenetére
Az semmiképp nem egészséges, hogy minden buffert 10x játszol le
Amúgy úgy látom különbözõ library verziót használunk, mert nekem a rate beállító fv tényleg nem pointer vár (ezért is írtam tegnap, hogy nekem mûködött az eredeti változat). Cserébe viszont nekem nem szól
MOD: már legalább szól16384 biztos sok volt neki. Alakulgat...
[Szerkesztve] -
Jester01
veterán
válasz
emitter #1493 üzenetére
Ezt a wav1.c-t sürgõsen felejtsd el! Fogalma sincs az ürgének mit csinál. Ha 4 byteos tömbbe olvas be, akkor azt pl. nem lehet strcmp-vel hasonlítani, mert nincs benne lezáró 0. Helyesen strncmp-vel 4 karakter hosszon stb. Ugyanezen okból nem tudod kiírni sem: %s-t próbáltál, ez pedig nem string, csak 4 karakter.
A wav2 nekem mûködik. Fordítsd debug infóval és nézd meg gdb-vel, hogy hol halálozik el.
melyik fv küldi a buffer tartalmát a hangkártyának?
Mégis mit gondolsz? Hiszen csak egyetlen hívás van a ciklusban, az snd_pcm_writei.
Egészen pontosan kell bele egy (f)read ami beolvassa a következõ 128 byteot. Gondolom érdemesebb lesz nagyobb buffert használni. -
Jester01
veterán
válasz
emitter #1491 üzenetére
Nemtom honnan szedted, de az összes hibás fread hívásból lemaradt egy & jel.
Amúgy a minimal playback progi kis módosítással lejátssza a wavod, ha nem baj, hogy a paramétereket nem a wavból veszi. Simán abban a lejátszó ciklusban feltöltöd a buf-t a fájlból (az elsõ - azt hiszem - 44 byteot átugrod, az a fejléc) -
Jester01
veterán
válasz
emitter #1485 üzenetére
Az undefined reference az linkelési hiba. Kell egy -lasound kapcsoló, mert ezek az alsa könyvtárban vannak.
honnan tudjam, hogy ez a fv milyen típusú mutatót vár 3. arg-ként
A legbiztosabb ha megnézed a header fájlban, hiszen a fordító is onnan tudja. De amúgy az alsa doksiban minden bizonnyal benne van.
A BYTE és DWORD típusokkal vigyázni kell, hogy amit használsz valóban 8 és 32 bit legyen. Ezt eselteg egy configure scripttel lehet ellenõrizni ami mindig kideríti melyik szabványos típus felel meg. De te most valóban nyugodtan írhatsz helyettük unsigned char-t és unsigned int-et. -
Jester01
veterán
válasz
emitter #1476 üzenetére
Destruktort (általában) nem kell meghívni, az meghívódik az objektum megszûnésekor magától. Ha mégis meg akarod hívni (de most nem
) akkor simán metódushívással (objektumpéldányra!)
A másik problémádra: az a baj, hogy a tagfüggvények implicit elsõ paraméterként megkapják az objektumra mutató pointert (this). Igy aztán már nem egyezik a prototípus. Csinálj belõle static metódust, az nem kap this pointert. Viszont abban ebbõl kifolyólag nem is hivatkozhatsz nem static tagokra.
MOD: ja és a send()-nek természetesen úgy mondod meg, hogy egy tagfüggvénybe rakodm, ezáltal elrejtve az implementációt.
[Szerkesztve] -
Jester01
veterán
válasz
emitter #1462 üzenetére
Huhh? Ha átálltál, akkor milyen buf-od van már megint? A size() az a string osztály metódusa:
#include <iostream>
#include <string>
using namespace std;
int main(int, char**)
{
string s;
getline(cin, s);
cout << ''length: '' << s.length() << '', size:'' << s.size() << endl;
return 0;
}
Esetleg a using-ot kifelejtetted? -
Jester01
veterán
válasz
emitter #1460 üzenetére
Elõször is eldöntöd, hogy mit akarsz használni. Ha maradsz a c ''stringeknél'' akkor a c-s stdio-t használod és a c-s függvényeket (strlen, fgets stb.) Ha c++ stringet használsz, akkor a c++ lehetõségeit használd (iostream, string stb). Ha pedig c++ stringbõl c string kell, akkor a c_str() metódussal azt is kaphatsz, de ez csak olvasható.
-
Jester01
veterán
válasz
emitter #1458 üzenetére
Az >> operátor ugyanúgy szavakat olvas mint a scanf %s formátuma. Ha egész sort akarsz, akkor használd a getline függvényt.
A <> és az idézõjel pont ugyanazt jelenti mint c-ben, mégpedig a keresési útvonalat határozza meg. Ha idézõjelet használsz, akkor az aktuális fájlhoz képest értelmezett relatív elérési útvonallal megadott directoryban keresi elõször és csak utána a -I kapcsolóval megadott illetve a beépített helyeken. A C++ headerek .h kiterjesztés nélkül vannak, pl. #include <string>. De ez mást tartalmaz mint a string.h! -
Jester01
veterán
válasz
emitter #1453 üzenetére
Figyi, te elloptad emitter nickjét? Neki azért sikerült egy aknakeresõ progit írni.
Az a sor NEM konvertálja az argv[1] stringet számmá ergo nem jó porton fog hallgatózni a szervered. Ha nem hiszed, írasd ki a MYPORT értékét.
Másik kérdésedre: az fg paranccsal elõtérbe hozhatod. -
Jester01
veterán
válasz
emitter #1447 üzenetére
megint nem gondolkoztam mielőtt írtam: csak konvertálnom kellett (socklen_t*)-vel
Rossz ötlet volt. A változó típusát kell átállítani, nem a pointert castolni. Pl. ha a socklen_t 64 bites és te egy int* pointert adsz be átcastolva, akkor szépen felülíródik az utána lévõ memóriaterület elsõ 4 byte-ja.
nagy nehezen tájöttem a hibára:
if( sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1){...
a sockfd-s kifejezést még külön be kellett zárójelezni... de hogy miért
Operátor precedencia. Különben miért volt nehéz? A gcc warningot dob érte...
server.cpp:36: warning: suggest parentheses around assignment used as truth value
Ugye az accept-nél is zárójeleztél? Én különben is kerülöm az értékadás+feltétel kombinációt, jelen esetben abszolút semmit nem nyersz vele. Ha simán azt írod, hogy
newfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
if (newfd == -1){
az sokkal olvashatób és még a precedencia dologba sem szaladsz bele.
Ugye a szerver a 9999-es porton listenel? Mert a kód amit kitettél a netre az tojik a parancssorra és mindenképp a 3490-es porton figyel. (netstat -l)
MOD: és amúgy mûködik is:
hcs:/tmp> ./server
Kliens ciminfoja:
ip: 16777343
port: 33205
Program vege. Nyomj egy bill-t!x
hcs:~> nc 127.0.0.1 3490
Hello world!
[Szerkesztve] -
Jester01
veterán
1. mi nem jó? Nekem szépen kilép az összes egymásbaágyazott shellbõl. Amúgy meg természetesen magadnak is ellenõrizheted a subshell visszatérési értékét ($?)
2. már írtam, hogy nem a ciklussal van a baj. Példa:
global=0
for((i=0;i<10;i++))
do
echo -n ''$i ''
global=$i
done
echo ''global=$global''
$ ./t.sh
0 1 2 3 4 5 6 7 8 9 global=9
CSAK akkor nem jó, ha valami oknál fogva másik shellben fut. -
Jester01
veterán
Vegyük észre, hogy itt a jó öreg subshell problémával állunk szemben.
A ctrl+c múködését pedig (bunkó módon) egy kill -INT $$ utasítással lehet szimulálni
MOD: ez sem jó, mert a $$ nem az aktuális shell pidje
Tyrael: A break-nek lehet megmondani, hány szintet ugorjon.
[Szerkesztve] -
Jester01
veterán
válasz
emitter #1397 üzenetére
Elvileg elég a virtuális hangkártya a szerverbe, de egyszerûbb egy full duplex hangkártyával ''felvenni'' a kimenõ hangot.
Olyan szinten lehet kompatibilitás, hogy a win által szolgáltatott streamet linuxon hallgathatod vagy fordítva. Viszont a feladat jelentõs része (értsd: hang kezelés) tök máshogy néz ki a 2 rendszeren. Szóval véleményem szerint a két platformra külön kell megírnod a progit. Bár lehetnek benne közös részek, pl. a magas szintû protokoll kezelése.
Szép feladat. -
Jester01
veterán
-
Jester01
veterán
válasz
emitter #1334 üzenetére
Igen, ez alap linuxon. A bemenet soronként pufferelt és echo módban van.
Használd a wincon.h-t, azért írtam
A terminálkezelõ curses könyvtár átkapcsolja a bemenetet és van benne getch is.
Egy kicsit módosítani kellene a headert, mert az inicializálás eléggé igénytelen módon az aknakeresõ progidhoz van illesztve (ha jól emlékszem arra épít, hogy az elsõ hívás egy képernyõtörlés lesz.) -
Jester01
veterán
válasz
emitter #1323 üzenetére
azt mondtad h szedjem ki a temp_failure-t, hát kiszedtem, de így meg a select ha jól látom, nem is hívódik meg sehol
Persze, mert azt is kiszedtedTalán azt hagyd benne, a return-nel egyetemben.
return select (FD_SETSIZE, &set, NULL, NULL, &timeout));
Már most nem tudom hogyan magyarázzam, ha az elõzõt nem értetted.
Na még egy próba.
Nézzük onnan, hogy mit szeretnél:
1. Ha a felhasználó megnyom egy gombot, akkor arra reagálni akarsz.
2. Másodpercenként kiírni az idõt.
3. Közben nem terhelni a processzort.
A 3. pont miatt meg kell mondani az operációs rendszernek, hogy az 1. és 2. események bekövetkeztekor fusson a progi. Ezt például a select függvénnyel lehet, ami azt tudja, hogy figyel tetszõleges számú fájlleírót megadott ideig. Billentyûleütés akkor van, ha a stdin fájlból van mit olvasni. Ezt szépen meg lehet adni a select-nek. Sajnos azt viszont nem tudja, hogy másodpercenként térjen vissza akkor is ha nincs billentyûleütés, csak várakozási idõt lehet neki megadni. Ezért a 2. pontot kicsit át kell fogalmazni, mégpedig úgy, hogy nem azt mondod, hogy másodpercenként, hanem azt, hogy a következõ másodpercig. Ezt pedig úgy csinálod, hogy minden frissítésnél illetve a select meghívása elõtt lekéred az idõt (a gettimeofday függvénnyel, mert kell a pontosság!) és a timeout értéket ebbõl számolod, értelemszerûen: timeout = elõzõ frissítés + 1mp - aktuális idõ.
A select visszatérési értéke elárulja, hogy az 1. vagy a 2. feltétel következett-e be, vagyis a felhasználó megnyomott egy gombot (ekkor getch() és eseménykezelés) vagy pedig a várakozási idõ járt le (ekkor idõ frissítése kell.). -
Jester01
veterán
válasz
Protezis #1321 üzenetére
Sajnos a static kulcsszót több célra is használja a C és a C++ is
Ha egy változót függvényen és osztályon kívül hozol létre (hogy is mondjuk ezt?), akkor az az adatszegmensbe kerül. A láthatóságát befolyásolja, hogy static vagy sem. Elõbbi esetben modulváltozó utóbbi esetben globális változó lesz. Globális változó másik modulból extern kulcsszóval deklarálva látható.
Ha függvényen belül vagy, akkor a static az ekvivalens egy modul változóval aminek a láthatósága az adott blokkon belülre korlátozódik.
Tömören: függvényen kívül mindig adatszegmens, a static a láthatóságot adja meg. Függvényen belül a láthatóság mindig az aktuális blokk végéig tart, a static az élettartamot adja meg.
Remélem jól mondom -
Jester01
veterán
válasz
emitter #1316 üzenetére
5?
Azt ne írja már ki ...
nem kaptam választ arra, h mi is az a file-descriptor
Pontosan az, amit írtál.Egy szám amivel alacsony szinten fájlokra lehet hivatkozni. A 0,1,2 sorban az stdin, stdout és stderr, de ezekre van makró. (STDIN_FILENO & co)
A select akkor tér vissza ha valamelyik fájlon a kért írás vagy olvasás elvégezhetõ avagy a timeout letelik. Jelen esetben arra használjuk, hogy térjen vissza ha történt gombnyomás (vagyis ha az stdin-rõl van mit olvasni) vagy letelt a következõ frissítésig hátralévõ idõ. -
Jester01
veterán
Ha ez a RealBasic Visual Basic 6.0 szintaxisú, akkor így:
Elsõ verzió (ajánlott):
Private Sub Button1_Click()
CommonAction
End Sub
Private Sub Button2_Click()
' button2 code
CommonAction
End Sub
Private Sub CommonAction()
' common code
End Sub
Másik verzió:
Private Sub Button1_Click()
' common code
End Sub
Private Sub Button2_Click()
' button2 code
Button1_Click
End Sub -
Jester01
veterán
válasz
Protezis #1308 üzenetére
C++ -ban hogy hozok létre lokális objektumot a veremben?
Ha függvényen belül definiálod, akkor az a verembe kerül, úgy mint minden más változó (automatikus változónak hívják, ha jól tévedek.) Explicit még az alloca és a placement new operátor segítségével, vagy felüldefiniált new operátorral tudsz a veremben létrehozni objektumot (ezek már csak a guruknak)
-
Jester01
veterán
válasz
emitter #1309 üzenetére
A TEMP_FAILURE_RETRY gondolom csak egy kis makró volt, ami addig próbálja a selectet amíg 0-t vagy 1-et ad vissza (vagyis nem hibát). Neked ez eleve nem jó, mert majd újra kell számolni a timeout-ot. Szóval simán hagyd el.
Úgy kell használni, hogy nyilvántartod mennyi idõ múlva esedékes a következõ frissítés, ez lesz a timeout értéke az input_timeout hívásban (kicsit át kell alakítani, hogy ne csak másodperceket tudjon). A filedes az az STDIN_FILENO, ahogy a példában is van. Megvizsgálod az input_timeout visszatérési értékét: ha 0 akkor timeout miatt tért vissza, vagyis az idõt kell kiírni. Ha 1 akkor a felhasználó nyomott egy billenytût amit nyugodtan beolvashatsz a getch()-val, már nem fog blokkolni.
Ezután lekéred az idõt, újraszámolod a timeout értékét és ismét mehet a select. Ne a time() függvényt használd, mert nagyobb pontosságra van szükség, hanem a gettimeofday-t. -
Jester01
veterán
válasz
emitter #1305 üzenetére
info libc, 13.8 Waiting for Input or Output. [link]
Az a lényeg, hogy olyan select hívást használj ami addig blokkol amíg nem lehet olvasni az stdin-t és nem múlik el a következõ frissítés idõpontja. (Ott a példa a doksiban)
Miracle, nyugodtan segíts ám te is, és szólj ha hülyeségekre biztatom Emittert -
-
Jester01
veterán
válasz
emitter #1299 üzenetére
A time_t az nem objektum, hanem pont az ami neked kell
info libc:
''it represents the number of seconds elapsed since 00:00:00 on January 1, 1970.
[...] In the GNU C library, `time_t' is equivalent to `long int'. In other systems, `time_t' might be either an integer or floating-point type.''
De hiszen ezt te magad is használtad már. -
Jester01
veterán
válasz
emitter #1293 üzenetére
vmi az ascii-kódokkal sincs rendben: csillagokat kéne írnia
Ja. A wincon.h-ban felveheted a leképezõ táblázatba.
az időszámlálóra visszatérve, szerinted nem fog menni a többszálúsággal
Mármint a windows-os többszálúságra gondoltam, hogy azt már nehéz lenne így transzparensen emulálni. Aztán lehet, hogy mégsem olyan ördöngõsség: a timer_create környékén nézelõdj. -
Jester01
veterán
válasz
emitter #1288 üzenetére
vsscanf meg nincs deklarálva...
Igen, úgy látom, hogy az feltételesen van csak benne az stdio.h-ban, csak C99 módban látszik. Szóval vagy be kell kapcsolni (most hirtelen nem is tudom mivel) vagy a vsscanf prototípust kell megadni (és nem az emul_scanf-et, amit te csináltál).
milyen ftp-klienst tudnál ajánlani, ami gyors és könnyen használható?
Midnight Commander? -
Jester01
veterán
válasz
emitter #1279 üzenetére
szóval itt ez a wincon.h, akkor ezt hova is másoljam be
Mindegy, a -I kapcsolóval mondhatod meg, hová tetted. A példámban a main.c mellett volt, ezért van a -I után pont.
a progim használ egy olyat, h windows.h, azzal mi lesz
Semmi, csinálj egy üres fájlt. Vagy szedd ki a forrásból. Vagy tedd be #ifndef __linux__ közé.
és akkor így kell fordítanom majd: make -funsigned-char -lm -lncurses -I main.c ugye?
Most éppen nem tudom milyen környezetet használsz, simán parancssorból a gcc -Wall -funsigned-char -lm -lncurses -I. -o main main.c lefordítja. -
Jester01
veterán
válasz
emitter #1274 üzenetére
Halló, megjöttem
A kódodon nem kellett sokat (semmit) átírni, mert csináltam egy kis headert
[link] ami leképezi a windowsos hívásokat linuxosra. Mivel leginkább konzol kezelésrõl van szó, így ez wincon -> curses leképezésrõl szólt. A többszálú idõméréssel nem tud mit kezdeni. Fordítani -funsigned-char -lm -lncurses -I. kapcsolókkal kell.
Persze ha eleve úgy fog neki valaki progit írni, hogy platformfüggetlen legyen, akkor nem ezt az utat választja. -
-
Jester01
veterán
Igen, arra gondoltam. Talan kicsit eros volt hulyesegnek titulalni...
Valahogy igy:
sum=0
cnt=0
for x in $@
do
sum=$((sum + x))
cnt=$((cnt + 1))
done
avg=$((sum * 100 / cnt))
echo ${avg%??}.${avg: -2:2}
Meg ellenorizni kellene a 0-t, hogy szep legyen az is. Azt hiszem massal nincs baja -
Jester01
veterán
válasz
emitter #1228 üzenetére
Lehet
make main (ha jól emlékszem main.c-nek hívják a progidat)
Még makefile sem kell hozzá, elég a beépített default.
Nézegesd a projekt beállításokat, valahol biztos ott van a használni kívánt fordító. A logot meg lökd fel a webre, megnézem. Jöhetsz ám msn-re is ha van kedved. -
Jester01
veterán
válasz
emitter #1185 üzenetére
A Sleep-et vedd ki, az jelképezte a programot (''Do other useful work here'')
A DeleteTimerQueue pedig kilépéskor kell, amikor már nem akarod, hogy fusson a másik szál.
MOD: majd nem használhatsz printf-et az idő kiírásnál, mert elállítja a kurzorpozíciót.
Helyette pl. a WriteConsoleOutput függvényt használhatod.
[Szerkesztve] -
Jester01
veterán
válasz
emitter #1181 üzenetére
Fejleszted? Király
Sajna neked egy getch()-t tartalmazó ciklusod van, ami bizonytalan ideig blokkolja a futási szálat, szóval folyamatos kiírást csak másik szálon tudsz csinálni. Szerencsére ez nem olyan nehéz [link] Az eventes dolog az neked nem kell. Gyakorlatilag csak egy CreateTimerQueue() és egy CreateTimerQueueTimer hívás, ahol ez utóbbinak megadod a függvény címét ami kiírja az időt. Mivel ez másik szálon fut az a legegyszerűbb, ha kap egy külön helyet a képernyőn amit csak ő használ így nem akad össze a fő szállal.
Amúgy a kódod kis módosítással nekem működik. A time(&t1) hívás a diff előtt inkább egy t1 = t2 értékadás. Az 500000 meg nevetségesen kis szám
MOD: Gyere msnre ha akarsz
[Szerkesztve] -
Jester01
veterán
válasz
emitter #1179 üzenetére
Milyen környezetben és mi a pontos elvárás?
Szinkron módon egyszerűen megvárod a következő másodpercet (Sleep) vagy gyakorta ellenőrzöd, hogy eltelt-e már egy másodperc.
Ha közben hosszabb dolga van a programnak, akkor valami aszinkron megoldás kell (időzítő, többszálúság, ...) -
Jester01
veterán
-
Jester01
veterán
válasz
emitter #1156 üzenetére
Az aknaz lényegi része valahogy így kellene kinézzen:
for(i=0;i<max_aknak; ) //aknák véletlen elhelyezése
{
int dx, dy;
int cx, cy;
j=rand()%my; //az aknák koordinátája 0,my és 0,mx között lehet
k=rand()%mx;
if(mezo[j][k].akna==0) //ha az adott mezõn már van akna, nem rakunk oda
{
mezo[j][k].akna = 1;
i++;
for(dy = -1; dy <= 1; dy++)
{
cy = j + dy;
if (cy >= 0 && cy < my)
{
for(dx = -1; dx <= 1; dx++)
{
cx = k + dx;
if ((dy != 0 || dx != 0) &&
cx >= 0 && cx < mx)
{
mezo[cy][cx].szomsz++;
}
}
}
}
}
}
A feltárós résznél nem igazán értem, hogy akkor most miben mit számolsz, de úgy sejtem, hogy egy ilyen módosítással jó lehet:
if (mezo[x][y].mark == -1)
{
(*mezoszam)++;
} else {
mezo[x][y].mark = -1;
(*maradt)++;
}
És ez nem kell a hívás elõtt:mezo[j-1][i-1].reveal=1;
mezo[j-1][i-1].mark=-1;
mezoszam++;
A mezoszam felteszem a feltárt vagy megjelölt mezõket számolja. Vagyis az automatikus feltárásnál csak akkor kell növelni, ha nem megjelölt mezõt tárunk fel, hiszen az már egyszer meg lett számolva. Viszont ha már meg volt jelölve, akkor most töröljük a jelölést, hiszen tudjuk, hogy nincs ott akna. Emiatt azonban a maradt változót növelni kell. Amúgy ez a +1/-1 a mark esetén elég sok fejfájást okozott nekem. Mostmár nehogy átírd, de a többi helyen használt 0/1 jobb lett volna.
MOD: szöveg jó, kód rossz[Szerkesztve]
-
Jester01
veterán
curses verzió:
Meg kellene csinálni, hogy ne rajzolja mindig újra az egész képernyőt, mert hálózaton kicsit lassú -
Jester01
veterán
válasz
emitter #1150 üzenetére
Segítség, megerőszakolták a függvényemet!
A temp az egy pointer lenne, tessék szépen kiírni a csillagokat.
Teljesen fölösleges minden hívásnál az egész táblát végigellenőrizni, hiszen elég csak az aktuális cellát vizsgálni.
És a harmadik: a hívás után közvetlenül van egy goto jatek; szóval sosem fogja figyelembe venni a temp kiszámított értékét, amit úgyis újraszámolsz. Ráadásul a maradt változót és a kiírást sem frissíted és a megjelölést sem szünteted meg. -
Jester01
veterán
-
Jester01
veterán
válasz
Jester01 #1146 üzenetére
Nagyon akartam aknát keresni, úgyhogy csináltam egy kis windows over ncurses emulátor réteget
Screenshot mûködés közben: [link]
Persze a színekkel meg a speciális keretrajzoló karakterekkel nem foglalkoztam.
Annyi haszna volt a dolognak, hogy felhívhatom a figyelmed arra a tényre, hogy a konzol ablak windows alatt is átméretezhetõ, vagyis nem szép dolog arra építeni, hogy 80 oszlop van.
Ja és persze kipróbáltam az automatikus feltárást isAzt kellene még lekezelnie, ha olyan mezõt tár fel, ahová a felhasználó már tett zászlót.
Valamint nem ártana egy #include <math.h> mivel így a floor függvényt implicit int visszatéréssel használja és telerakja aknával az egész táblátPersze lehet, hogy windows alatt valamelyik másik header már berántja, akkor vedd úgy, hogy nem szóltam.
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
- Torrent meghívó kunyeráló
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Debrecen és környéke adok-veszek-beszélgetek
- SSD kibeszélő
- 5.1, 7.1 és gamer fejhallgatók
- Apple asztali gépek
- Csökkentik a fogyasztást a Google AI-adatközpontok, hogy ne legyen áramszünet
- gban: Ingyen kellene, de tegnapra
- Tőzsde és gazdaság
- Futárcégek
- További aktív témák...
- ROG Zephyrus G14 GA403UV 14" 3K OLED Ryzen 9 8945HS RTX 4060 16GB 1TB NVMe IR kam gar
- T14 Gen2i 14" FHD IPS i5-1135G7 16GB 256GB NVMe magyar vbill ujjlolv IR kam gar
- X1 Carbon 12th 14" FHD+ IPS Ultra 5 135U 16GB 512GB NVMe ujjlolv IR kam gar
- T14 Gen1 14" FHD IPS i5-10210U 16GB 256GB NVMe ujjlolv IR kam gar
- Eladó vadonatúj, Sovol SV06 Plus 3D nyomtató
- Samsung Galaxy A12 64GB Kártyafüggetlen 1 év Garanciával
- Gamer PC-Számítógép! Csere-Beszámítás! R5 1600X / GTX 1080 8GB / 32GB DDR4 / 256SSD + 2TB HDD
- IKEA (HAVREHOJ) tablet tartó
- GYÖNYÖRŰ iPhone 16 128GB Ultramarine -1 ÉV GARANCIA - Kártyafüggetlen, MS3097, 100% Akkumulátor
- Okosóra felvásárlás!! Samsung Galaxy Watch 6, Samsung Galaxy Watch 7, Samsung Galaxy Watch Ultra
Állásajánlatok
Cég: FOTC
Város: Budapest