- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- sziku69: Szólánc.
- bambano: Bambanő háza tája
- eBay-es kütyük kis pénzért
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- gban: Ingyen kellene, de tegnapra
- btz: Internet fejlesztés országosan!
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Lenry: Windows 11 telepítése inkompatibilis gépre
Hirdetés
-
LOGOUT
Új hozzászólás Aktív témák
-
Jester01
veterán
válasz
emitter #1138 üzenetére
Igen, ez pontosan ezt jelenti
Amit te írtál, az sajnos azt jelentené, hogy csak átlósan menne tovább, hiszen megköveteled, hogy i és j sem nulla. Amit én írtam, az a !(i == 0 && j== 0) átalakítása a De Morgan azonosság szerint. Lehet, hogy ebben a formában érthetõbb lett volna, bocs
MOD: Amúgy ezt meg lehet spórolni, ha elõre felveszed mind a 8 lehetséges elmozdulásvektort és simán egy ciklusban mész végig rajtuk.[Szerkesztve]
-
Jester01
veterán
válasz
emitter #1134 üzenetére
kicsit bonyolultabb a helyzet, mint gondoljátok
Nagyképűség be: Szerintem mi remekül átlátjuk a helyzetet
Van ilyen egyáltalán?
Nincs. De magadnak ellenőrizheted.int mx, my; /* palya meret */
int x, y; /* ennek a szomszedait keressuk */
for(int dx = -1; dx <= 1; dx++)
{
for(int dy = -1; dy <= 1; dy++)
{
int cx = x + dx;
int cy = y + dy;
if ((dx != 0 || dy != 0) && cx >= 0 && cx < mx && cy >= 0 && cy < my)
{
...
}
}
}
Nyilván külön függvénybe is teheted az ellenőrzést, és akkor még szebb lesz.
MOD: A cx kiszámítását és ellenőrzését persze az y cikluson kívülre is lehet tenni, úgy gyorsabb lesz[Szerkesztve]
-
-
Jester01
veterán
válasz
emitter #1129 üzenetére
Rögvest három probléma is van vele, de fagyasztani elvileg csak az egyik fagyaszt. De a végtelen ciklus egyébként is garantált
if(y==0) //ha a legfelsõ sorban vagyunk
{
if(mezo[x][y-1].akna==0)
Ez nagyon egészségtelen. -1 lesz az index. Bye-bye ...
MOD: ebbõl van több is. Nem lenne egyszerûbb, ha mindig kiszámolnád mind a nyolc szomszéd koordinátáját, és egyszerûen ellenõriznéd, hogy a pályán belülre esik-e?
Második probléma, hogy nem ellenõrzöd merre jártál már.
A harmadik pedig alapvetõ koncepciós probléma: nem azt kell nézni, hogy az adott mezõn van-e akna, hanem azt, hogy az adott mezõ szomszédain van-e akna. Csak akkor szabad továbbmenni, ha egyik szomszédján sincs.[Szerkesztve]
-
emitter
őstag
válasz
emitter #1128 üzenetére
most palya**-t adtam vissza a load()-dal, most nem fagy
és műxik a betöltés is, eddig miden ok, köcce
még ott van viszont a szerencsétlen és átláthatatlan feltar() fv-em, ami szintén fagyaszt, de simán elronthattam benne akármit, mert rekurzív, és mint mondtam, ehhez nem sokat értek
bár ha te sem találod meg benne első ránézésre a hibát, akkor sztem ne fáradj vele, legfeljebb kihagyom a progiból ezt a fícsörtmondjuk így majd sokkal többet kell kattintgatni...
-
Jester01
veterán
válasz
emitter #1125 üzenetére
Khm, a fejed fogod a falba csapkodni
A fagyi konkrétan azért van, mert a mezo változót akarod felszabadítani, aminek sosem adtál értéket. Ugyanúgy mint az mx és my esetén, ha azt akarod, hogy a függvénybõl visszajöjjön, akkor pointert kell átadni. Itt ez már 3 csillag lesz(Persze void visszatérési típus helyett lehet palya** is, és akkor return-nel adod vissza)
Ezen kívül: nem tudom mit ittál amikor ezt írtad:
temp=(char*)malloc((*mx)*sizeof(char)+(int)my);
Gondolom szegény fordító tiltakozott az my ellen (hiszen az most egy pointer!), de te jól ''megerõszakoltad''
Mivel az egész pálya most egy sorban van, így nyilván 4 * (*mx) * (*my) hely kell. Plusz az egy byte a lezáró nullának amire már valamikor felhívtam a figyelmed
Ha ez mind megvan, akkor már csak az a baj, hogy a k=k+4 rossz helyen van, a belsõ ciklusmag végére való (vagyis a kapcsoszárójelen belülre). -
Jester01
veterán
válasz
emitter #1092 üzenetére
Ez most jónak tűnik, kivéve, hogy a temp változó mérete eggyel kisebb mint kellene, mert a fscanf tesz egy lezáró nulla byteot a beolvasott string végére. De hogy ettől fagy-e azt nem tudom. Esetleg a program másik részében lehet hiba. (Miért nem rakod ki az egészet a weboldalra?
)
Amúgy a k változóra nincs szükség, mert egyszerűen 4*j módon számítható. De ez nyilván nem hiba. Legközelebb holnap este leszek, remélem addig segít valaki más[Szerkesztve]
-
Jester01
veterán
válasz
emitter #1089 üzenetére
A temp az minek is? A c változót hol inicializálod? A ciklusban j miért 4*(*mx) -ig megy?
Gondolom azt akartad csinálni, hogy a temp-be beolvasod a sort, és aztán abból alakítod át a saját adattípusodra. Ez persze fölösleges, ha úgyis fgetc-t hívsz.for(i=0;i<*my;i++) //az allas beolvasasa
{
for(j=0;j<*mx;j++)
{
mezo[ i ][ j ].akna=fgetc(fs)-48;
mezo[ i ][ j ].reveal=fgetc(fs)-48;
mezo[ i ][ j ].mark=fgetc(fs)-48;
mezo[ i ][ j ].szomsz=fgetc(fs)-48;
printf(''%d'',mezo[ i ][ j ].akna);
}
MOD: az persze kérdés, hogy a mentett állásban táblasorok után van-e enter, vagy egy sor az egész. A fenti kód akkor működik, ha egy sor.
[Szerkesztve] -
Jester01
veterán
-
Jester01
veterán
válasz
emitter #1070 üzenetére
remélem működni fog, mert ezt most hirtelen a szám-rendezősből írtam át
Sajna nem fog
qsort (tomb, elemszam, maxhossz*sizeof (char), string_cmp);
...
ahol maxhossz a tomb legnagyobb sztrigjének a hossza
Itt egy (char*) elemeket tartalmazó tömböt rendezel. Vagyis helyesen:
qsort (tomb, elemszam, sizeof(char*), string_cmp)
A stringek hossza nem számít. Amúgy jelen feladat esetén ha a string betûit rendezzük, akkor a generált permutációk már eleve a jó sorrendben jönnek ki. Tehát nem ilyen rendezés kell, hanem az eredeti (a számos), csak nem int hanem char típussal. -
Jester01
veterán
válasz
emitter #1075 üzenetére
fscanf példád azért nem jó, mert a \n whitespace, és mint ilyen, azt jelenti, hogy bármennyi bármilyen whitespace lehet ott. Helyette (ha mindenképp fscanf kell) a fscanf(f, ''%*[\n]'') lehet jó. Mit jelent az, hogy új sorra pozícionálni? Eldobni a sorból hátralévõ összes karaktert? fscanf(f, ''%*[^\n]%*[\n]'').
Az fgetc() karaktert olvas be.
A sor helyes, csak nem azt csinálja amire te feltehetõleg gondolsz. Az i egymás utáni hívások esetén 48 vagy 49 lesz (a 0 és az 1 ascii kódja). -
Deark
csendes tag
válasz
emitter #1067 üzenetére
Eddig a betűk keverésére nem találtam lineáris algoritmust...
Gondoltam arra, hogy randomizálom az egészet és mindig megvizsgálom, hogy már megvan-e az adott string, de ez egy 10 betűs szónál túl sok lenne. Max 1 mp alatt le kéne futnia.
Gondoltam még arra is, hogy számrendszerekkel hozom össze valahogy. Tehát hogy olyan számrendszer, ahány karakteres a string. De még nem tom, hogy hogyan...
Szerintem a sok ciklus nem lenne ronda, azaz nem lenne baj, ha az. Max 10 betűs lehet a szó. (ezt nem kell ellenőrizni. alapból ilyen szavakkal lesz feltöltve.) -
Jester01
veterán
válasz
emitter #1032 üzenetére
Azért mert neked kell előre lefoglalni a helyet a stringnek.
Ugyanez igaz a scanf-re is, gondolom ezért fagy a progid.
És ha már lefoglaltad a helyet, akkor biztosítani kell, nehogy túl sokat írj bele (ez az ún. buffer overrun, ami azon kívül, hogy bug még biztonsági rés is)
A helyet statikusan vagy dinamikusan foglalhatod. Pl. az itoa esetén legrosszabb esetben 12 byte hely kell, úgyhogy a char* s helyett írhatsz char s[ 12 ]-t.
De továbbra is ajánlom az fprintf-et mert akkor nem kell bufferrel szórakozni. -
Jester01
veterán
válasz
emitter #1028 üzenetére
1. A létező fájlt illene bezárni akkor is, ha a felhasználó nem kér felülírást.
2. Ha a c != 'i', akkor a return miatt visszatér, így a while-ban nincs is mit ellenőrizni. Amit különben is elrontottál, hiszen csak akkor lépne ki, ha a c egyszerre 'i' és 'n' is, ami lehetetlen.
3. Az itoa inicializálatlan területre fog írni. Ha szöveges mentést akarsz csinálni, akkor egyszerűbb az fprintf(f, ...) formát használni.Bináris mentéshez fwrite.
4. A mentésednek nem sok értelme lesz, ha nem írod bele a pálya méretét.
5. fclose előtt nem szükséges fflush (de nem is árt - ezt akár benne is hagyhatod) -
Jester01
veterán
válasz
emitter #1024 üzenetére
Ez az eredeti verzió. Az mindenképpen igaz, hogy a ciklusnak addig kell futni, amennyit foglalsz. Csak nem a ciklus a rossz, hanem a foglalás, mivel a progidban egyébként az y az első koordináta. Szóval így:
mezo=malloc(my*sizeof(palya*)); //dinamikus memoriafoglalas
if(mezo==NULL)
{
fprintf(stderr,''Out of memory!\n'');
return -1;
}
for(i=0;i<my;i++)
{
mezo[ i ]=malloc(mx*sizeof(palya)); -
Jester01
veterán
válasz
emitter #1016 üzenetére
miért foglal a progim a windóz szerint 44kB-ot, mikor van összesen 6 int változóm, összesen 12bájtot kéne foglalni nekik, nem?
Programkód, verem, betöltött dllek ...
Egyébként az int az 32 bites szóval 24 byte.
én számításaim alapján 2mb-ot kéne foglaljon, mégis 4megát foglal
Lásd fennt, valamint van overhead is. Plusz ha debug verziót fordítasz akkor sokkal több helyet foglal.
segítsetek pls
Honnan tölthetem le a kódot? -
Jester01
veterán
válasz
emitter #1014 üzenetére
Sajnos az üres sort már a scanf lekezeli, úgyhogy muszáj lesz fgets/sscanf párosra átállni.
A 9,10g esetet pedig úgy lehet megvizsgálni, hogy megköveteljük a sorvég jelet a második szám után:do{
char buf[80];
char c;
printf(''Mekkora palyan szeretne jatszani? (sor,oszlop) '');
fgets(buf, 80, stdin);
temp=sscanf(buf, ''%d,%d%[\n]'', &mx, &my, &c);
} while( (temp!=3) );
Ezzel most még az a baj, hogy a sor lehet hosszabb mint 80 karakter, házi feladat, hogy ezt még ellenőrizd. -
Jester01
veterán
válasz
emitter #1000 üzenetére
A foglaláskor és a felszabadításkor a belsõ ciklusban cella[i] kell, hiszen az i. sort (oszlopot) piszkáljuk. Általában (persze nem mindig) eleve gyanúsak az olyan ciklusok amelyek magjában nincs hivatkozás a ciklusváltozóra. Te pedig ugyanazt a változót írtad felül úrja meg újra.
A bekérõ kód kicsit zavarosra sikerült, a végtelen ciklustól eltekintve is.
A temp változót fölösleges kinullázni, hiszen úgyis értéket adsz neki.
A típusa feltehetõleg int, mivel a scanf azzal tér vissza. Márpedig ha ez így van, akkor ne NULL-lal hasonlítsd össze, mert az pointer.
Az az összehasonlítás egyébként teljesen felesleges, hiszen a kilépési feltétel elegendõ. Nézd meg hogyan lehet bekapcsolni a figyelmeztetéseket a fordítóban, szokott segíteni. Gcc pl. a fenti összehasonlításért is szól:
warning: comparison between pointer and integer.
A végtelen ciklus pedig azért van, mert a scanf abbahagyja a beolvasást az elsõ olyan karakternél amit nem tud értelmezni. Igy aztán legközelebb megint belefut. Ki kell ûríteni az input puffert, pl. ilyesmivel:while(getchar() != '\n');
[Szerkesztve] -
Jester01
veterán
aha, akkor ezt most a main-be írjam?
A típus deklarációt ne (azt kirakhatod egy header fájlba), csak a példányosítást.
mit tárolnék a cell típusban?
Amit akarsz, te írtad: egy két dimenziós tömbben tárolnám az egyes cellák tulajdonságait, azaz a tömb minden eleme egy struktúra lennestruct state {
int xsize;
int ysize;
struct cell** cells;
...
};
A kétdimenziós tömb tulajdonképpen egy pointertömbre mutató pointer, ezért ciklusban kell lefoglalni:
[link]
Figyelj oda, hogy a te példádban definiáltál egy cella nevű globális változót, amire nincs szükséged. Ha tulajdonképpen rövid nevet akartál, akkor egy typedef kell elé:typedef struct cell
{
int vmi;
int vmi;
...
} cella; -
Jester01
veterán
még csak most tanulgatom a C-t, nem megy minden elsőre
Semmi probléma, próbálkozz és kérdezz nyugodtan
Alapvetően szebb, ha nem globális a tömböd. És hogy egyszerűbb legyen dolgozni vele,
rakd bele egy struktúrába, pl így:struct cell {
...
};
struct state {
int xsize;
int ysize;
struct cell* cells;
...
};
Innentől kezdve elég egy state típusú változót átadni a függvényeidnek, és egyben megkapják a szükséges információkat. Ha valóban kétdimenziós tömböt akarsz, akkor
struct cell** cells kell, csak ilyenkor bonyolultabb az inicializálás és felszabadítás (cserébe viszont egyszerűbb az indexelés). -
Jester01
veterán
az mit jelent hogy ''invalid use of array with unspecified bounds
Nemtom, szerintem pont olyasmit, amihez ismerni kellene a méretet. (sizeof pl.)
szóval egy függvénynek akarom átadni a tömböt paraméterként, és a fv belül kéne, h tudja a sorok és oszlopok számát
Ehhez át kell adnod a méretet is paraméterben. -
Jester01
veterán
viszont nem igazán tudom értelmezni a clrscr() -t
Ez a kód egy-az-egyben a microsoft oldaláról van, csak kitörölték a megjegyzéseketItt az eredeti: [link]
ha egy konzolablakban véget ér valahol a szöveg, akkor az utolsó karakterhelyen áll valamilyen lezárókarakter
Nem.
hogyan oldhatnám meg, hogy takarékosság miatt pontosan csak az utolsó sorig törölje a képernyőt
Megjegyzed mennyit írtál ki.
az adott kurzor-pozíción álló karaktert adja vissza
ReadConsoleOutputCharacter [link] -
Jester01
veterán
-
Jester01
veterán
Az ncurses sem kifejezetten linuxos és azt különben is csak a referencia miatt tettem be.
Maga a curses (mert azt írtam) az platformfüggetlen, van windowsra is.
A winapinál meg ne keverjük a szezont a fazonnal. Winapi, mert az operációs rendszert szerencsétlen módon windowsnak hívják. De ezek nem grafikus függvények, mint ahogy egy csomó más winapi függvény sem. Például a kurzor pozíciót a SetConsoleCursorPosition függvénnyel lehet állítani.
Sajna konkrétan devc-hez nem értek, nem tudom mire lehet rávenni és mire nem.
A haragos smileyt meg mivel érdemeltem ki? -
Jester01
veterán
csillagászati okai vannak?
Igen. Az év hossza (kb) 365.242199 nap. Vagyis 4 évente majdnem egy teljes nap (0.97) csúszás van.
Ha ezt teljes napként korrigáljuk, akkor 100 év alatt már kb 0.78 nappal ''túlkorrigáltunk'', ezért azt visszavesszük (igazából elég lenne 125 évenként, de így egyszerûbb). Így viszont megint alulkorrigálunk, ezért a 400 éves szabály. És így tovább. Ráadásul a szökõmásodpercekrõl még nem is beszéltünk. -
PGee
tag
-
Sikoly
tag
Nálunk tavaly volt egy nagyon aranyos kis házifeladat a ZH-hoz:
aknakereső programot kellett írni!
Bemásolom ide az egész szöveget, hátha segít:
a) A játék egy MxN-es pályán játszódik. Az oszlopok jelölése betűvel (A..Z), a soroké számmal (1..26) történik. A pálya egyes mezőin bombák lehetnek. A pálya méretét (M és N) és a bombák sűrűségét (%) a játék kezdetén kell megadni. A bombák helye természetesen játékról játéra véletlenszerűen változik.
Az adatok megadása után a program kirajzolja a pályát, majd várakozik a játékos parancsára. Kezdetben minden mező helyén ? karaktert láthatunk. A játékos ezután a következő alakú parancsokat adhatja ki:
<oszlop><sor>
<oszlop><sor>!
Az első alakú parancs a mezőt „felderíti”. Amennyiben a mezőn bomba volt, a játék sikertelenül befejeződik. Ellenkező esetben a az adott mező helyén a ? helyett a szomszédos nyolc mezőn található bombák száma jelenik meg, illetve szóköz, amennyiben ez a szám 0. A második alakú paranccsal olyan mezőt jelölhetünk meg, amelyen bombát sejtünk.
A játékos egy lépésben több parancsot is megadhat, vesszővel elválasztva. Az érvénytelen parancs megadását a program hibaüzenettel jelzi. A program minden lépés után kirajzolja a módosult pályát, és újra várakozik a játékos parancsaira.
A játék akkor ér véget, ha a játékos aknát rejtő mezőre lép (veszít), vagy az összes nem aknát rejtő mezőt felderíti (nyer). Utóbbi esetben a program kiírja a játékos lépéseinek számát. Amennyiben veszít a játékos, a játék kiírja az összes mező tartalmát. A bombák helyét b betű jelzi.
b) Fejleszd tovább a játékot úgy, hogy amennyiben egy „felderített” cellának egyik szomszédján sincsen bomba, úgy a program automatikusan derítse fel az összes szomszédját is, egészen addig, amíg így nulla szomszédú cellára bukkan. A megjelölt (!) mezők nem vesznek részt az előbb említett „automatikus felderítésben”.
c) Egészítsd ki az aknakereső játékot a következő parancsokkal:
elment <állománynév>
betölt <állománynév>
Az első parancs a játék aktuális állását az adott állományba írja, ahonnan az később a betölt parancssal visszaolvasható kell, hogy legyen. Az állomány formátuma tetszőleges, de természetesen minden adatot tartalmaznia kell, ami a játék folytatásához szükséges (bombák helye, felderített mezők, megtett lépések száma). Az elment parancs természetesen csak játék közben adható ki, a betölt parancs játék közbeni kiadásakor viszont a játékostól megerősítést kell kérni.
sztem eléggé ötletes & talán még egyedi is
[Szerkesztve] -
-
emitter
őstag
na, hát végülis megcsináltam egy sima ciklussal az érték-ellenőrzést, de azért még mindig örülnék az egyszerűbb ötleteknek, feltéve hogy van ilyen
más:
még mindig nem sikerült megoldani azt, h ha scanf egy sima üres enter-t kap, akkor csináljon vmit (lépjen ki az adat-bekérő ciklusból)
devc++ban nem műxik a conio.h, szal a getch() se, más megoldást nem tudtok?
(sima int számokat akarok beolvasni, enter-rel elválasztva az egyes bekéréseket, előre nem ismert alkalommal kéne a bekérő-ciklusnak lefutnia, és egy üres enter-rel lenne vége) -
Miracle
senior tag
nem, nem tudom a pontos szabalyokat uppolasra de azokban a topikokban ahova irni szoktam nem szeretem az ilyen felorankent uppolast, mert annak semmi ertelme, csak telefossa hozzaszolassal az egeszet.
a problema az, hogy a conio.h a borland speci cucca, es csak borland C forditoval mukodik, azaz pontosabban csak abban van benne. szoval ha devC++al fejlesztesz akkor a C vagy C++ standard konyvtaraira kell hagyatkozni, vagy keresni valamilyen libet, amit a mingw (a devc++ forditoja) le tud forditani. persze erre csak akkor van szukseg ha valami tenyel komoly programot fejlesz, menuvel, stb. mert ha nem akkor a standard C library boven eleg lesz. linux alatt a kulonbozo courses verziok ilyen libek, de nem tudom pontosan windows alatt mivel lehet ilyet csinalni. ugy emlekszem devC++ topikokban mar elojott a kerdes, nezd meg ott. -
Miracle
senior tag
-
emitter
őstag
vagy annak a megoldásnak is örülnék, ha egy sorban, de mondjuk vesszővel (vagy szóközzel) elválasztva adhatnám be a számokat, és a végén egy [enter] hatására beolvasná a vesszők között álló számokat egy tömbbe
ja, az előző verziót is egy tömbben szeretném tárolni, melynek méretét előre nem tudom, annyi eleme lesz, amennyi számot az [enter] lenyomásáig beolvasott a progi.
mintha úgy emlékeznék, h hasonló probléma megoldása pascalban egyszerűbb volt... -
Miracle
senior tag
az ablak eltunese ellen a devc++ altal generalt standard konzol applikacio ket programsorabol a felso nyujtja a helyes megoldast:
system(''pause'');
ez bill.lenyomasig tartja majd a konzolablakot.
pontosvesszot azert nem tudsz irni mert a decomment line gyorsbillentyu van rakonfiguralva a kerdeses bill.kombinaciora. keresd meg a gyorsbillentyuk beallitasait es szedd ki ezt a hotkeyt.
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
- Milyen autót vegyek?
- Elemlámpa, zseblámpa
- WoW avagy World of Warcraft -=MMORPG=-
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- sziku69: Fűzzük össze a szavakat :)
- Kettő együtt: Radeon RX 9070 és 9070 XT tesztje
- 3D nyomtatás
- Új, belépő szintű Radeont kapnak az OEM-ek
- iPhone topik
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- További aktív témák...
- Új Dell 14 Inspiron 5435 FHD+ Ryzen7 7730U 4.5Ghz 16GB 512GB SSD Radeon RX Vega 8 Win11 Garancia
- Bomba ár! Dell Latitude 5510 - i5-10G I 8GB I 256SSD I HDMI I 15,6" FHD I Cam I W11 I Gari!
- Asus ROG Zephyrus G14 GA401IV - 14" FHD 120Hz - Ryzen 9 - 4900HS - 16GB - 2TB - RTX 2060 - Win11
- Update 08.12. - Bomba árak 2025-ben is! Üzleti - Consumer laptopok DELL FUJITSU HP LENOVO
- Apple iPhone 13 / 128GB / Gyárifüggetlen / 12Hó Garancia / 87% akku
Állásajánlatok
Cég: FOTC
Város: Budapest