Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Nájdite dve logické chyby v programe

Poznáme tieto druhy chýb:

1. Syntaktická - preklepy, nevhodné priradenia atď.

2. Behová - chyba za behu programu - prekročenie zásobníka, rozsahu vstupu alebo tiež napr. pokus o čítanie neexistujúceho súboru - program sa zrúti

3. Logická - tieto chyby sú najzávažnejšie a najťažšie sa hľadajú. Pri týchto chybách sa program nezrúti, ale môže sa stať, že predsa skončí behovou chybou, ale až na následky tejto chyby, čiže niekedy to môže byť aj omnoho neskôr ako procesor spracuje príkaz, ktorý obsahuje logickú chybu. Samozrejme, aby sme to my programátori nemali ľahké, program na následky tejto chyby nezrúti a my sa môžme aj zblázniť, pretože nevieme, prečo ten program dáva taký výstup, aký nemá dávať.

Vašou úlohou je v programe nájsť dve logické chyby. Budete mať k dispozícii skompilovaný program a jeho zdrojový kód so všetkým čo k tomu patrí, aby sa vám náhodou nestalo, že vám to váš kompilátor odmietne skompilovať. Ak by náhodou predsa vznikol nejaký problém s oživením programu, tak to nejako poriešime.

A čo budete k tomu potrebovať:

1. Možnosť práce s DOSom - takže ak máte vo Windows XP problémy s DOSom, tak treba DOSBox, ale myslím, že by to problém robiť nemalo, lebo v tomto prípade mne stačí aj emulácia DOSu vo Windows XP.

2. Prekladač Turbo Pascalu - najlepšie bude, ak budete mať verziu 7.0, pretože program bol napísaný v ňom, ale s drobnými úpravami vám pobeží aj vo verzii 6.0.

Link na stiahnutie kompletného balíka:
wurmi.zip

BTW, chyby hľadajte v engine hry, nie v menu.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
To ozaj nikto nedokáže stiahnuť alebo ste to nechali tak?:-(
msx. 09.06.2006 14:34
msx.
To je dost komplexna tematika, nie je cas/chut. A autor evidentne povazuje komentare za zbytocny lux…
MM.. 09.06.2006 15:49
MM..
Počas vývoja verzie pod Windows občas nahliadnem do verzie 3.0. Tam komentáre mám. Čiže tie komentár… poslední
msx. 21.06.2006 11:34
msx.
No takze ta chyba s tym "vyhodenim z programu" je IMHO v tom, ze po prejdeni sekcie "body:" v fcii "…
MM.. 11.06.2006 17:41
MM..
Presne tak. Samozrejme to je už opravené. No a ešte ostala tretia chyba. Tú zatiaľ nikto nespomenul.…
msx. 11.06.2006 17:56
msx.
Ponaucenie: neukladat si zbytocne data ktore zavisia od inych dat, tazko sa to potom udrziava na spr…
MM.. 11.06.2006 18:06
MM..
Áno dá sa aj tak, ale tu išlo o efekt skracovania, takže po skrátení to malo byť v poriadku, no ale…
msx. 11.06.2006 18:35
msx.
To je ale tretia chyba ktoru som chcel prave napisat :-D Ak nasmerujem hlavu za chvost (je jedno aka…
MM.. 11.06.2006 18:50
MM..
No to súvisí s tým žraním vlastného tela. Opravou tej chyby sa opravilo aj toto.:-) Hint pre tretiu…
msx. 11.06.2006 22:41
msx.
nie nie, to su dve uplne rozdielne chyby :-) Jedna je nespravna dlzka po akomkolvek zozrani sameho s… nový
MM.. 11.06.2006 23:30
MM..
Veď aj ja som zakrútil hlavou, keď som prišiel na to, kde bol problém s časom. Potom som to prerobil… nový
msx. 12.06.2006 09:11
msx.

To je dost komplexna tematika, nie je cas/chut. A autor evidentne povazuje komentare za zbytocny luxus... :-/
P.S. a s takymi nazvami premennych ake tam su (citujem: f, a, wx, wy, w0, w1, pa, over, pc, pn, pl, ps, px, wl0, wt0, pa0, z0) sa to musi logickymi chybami len hemzit ;-)8-) Este dobre ze tam nie su premenne s nazvami aa, a1, aa1, a2, a3, a4, a5, a6 :-D
Ale hra je to pekna, dokonca mi isla aj na W2k aj so zvukom so speakeru ::) som az cumel.

Počas vývoja verzie pod Windows občas nahliadnem do verzie 3.0. Tam komentáre mám. Čiže tie komentáre chýbajú ozaj len v tejto prvej verzii. Táto posledná verzia (vo vývoji) je prehľadná až až.:-)

No takze ta chyba s tym "vyhodenim z programu" je IMHO v tom, ze po prejdeni sekcie "body:" v fcii "writewurmi" je dlzka (premenna "wl") o jedno mensia ako by mala byt (pri kazdom prechode tej fcie sa musi raz zvysit "w1" bez toho aby sa znizilo "wl").
T.j. po kazdom zozrani sameho seba je dlzka mensia o 1 ako by mala byt.

Ponaucenie: neukladat si zbytocne data ktore zavisia od inych dat, tazko sa to potom udrziava na spravnej hodnote. To vidim dost casto, neviem preco ludi laka mat vsetko kdesi v milion premennych. Pre casovo kriticke operacie sa to da vyratat pred casovo kritickou operaciou a ulozit do docasnej premennej (resp. rovno ako parameter casovo kritickej fcie). Dlzka je predsa:

int iWurmLength;
iWurmLength = w0-w1;
if(iWurmLength<0) iWurmLength += wmax+1;

alebo jednym riadkom

iWurmLength = w0>=w1 ? w0-w1 : w0+wmax+1-w1;

wmax+1 preto, lebo je pole definovane ako 0..wmax (t.j. wmax+1) prvkov (to tiez nie je moc obvykle, v C by som urobil pole Wurm[MAX_WURM_LEN] co by vytvorilo pole s indexami 0..(MAX_WURM_LEN-1), je to obvyklejsie, v tom pripade by som mal
iWurmLength = w0>=w1 ? w0-w1 : w0-w1+MAX_WURM_LEN

To vsetko plati ak to chces mat tak ako teraz (ze ak je samotna hlava tak sa to povazuje za dlzku=0, neviem ci si to tak chcel alebo je to chyba).

Áno dá sa aj tak, ale tu išlo o efekt skracovania, takže po skrátení to malo byť v poriadku, no ale ako som neskôr zistil, odčítal som jednotku navyše. Išlo o to, (teraz som si spomenul, že ak Wurmi bol stočený do 4 bodov:

xO
xx

x - telo
O - hlava

tak sa stalo to, že ak bol otočený k telu, tak sa neposunul a zožral si chvosť, hoci mu koniec nezmizol a a potom sa posunul. Ide o to, že sa mal posunúť a chvost si nemal zožrať. Kontrola na zožratie sa mala vykonať až po posunutí a to bola chyba.

To je ale tretia chyba ktoru som chcel prave napisat :-D Ak nasmerujem hlavu za chvost (je jedno aka je dlzka, moze byt dlhy aj 100), tak si pri kazdom kroku zere chvost t.j. najprv treba uvolnit chvost az potom testovat dalsi krok.
Su tam este dalsie chyby? (daj nejaky hint ze v com konkretnejsie :-))

nie nie, to su dve uplne rozdielne chyby :-) Jedna je nespravna dlzka po akomkolvek zozrani sameho seba, druha je ze ak idem za chvostom tak sa furt zere chvost (ak by si opravil len dlzku, tak tam stale vadi to, ze to stale pipne akokeby si si zral chvost ked mas hlavu za chvostom).

Cas sa mi zdal ze ide nejak divne, ja by som to ratanie riesil inac, ale ani v tom tvojom nevidim v ratani casu problem (okrem toho ze to moze namiesto dvoch sekund vziat jednu ak sa to dlhsie zdrzi vo writewurmi, ale to by nemalo nastavat), si si isty ze v tych zdrojakoch je problem s casom? :-)

//edit: aha uz vidim ze si neupdatujes t0, to by mohlo robit problem, cele ratanie casu by som tam prerobil (ja mam najradsej ratanie tickov s tym nie je nikdy problem :-)). P.S. na to ratanie casu som sa dival uz predvcerom, som dost krutil hlavou :-/

Veď aj ja som zakrútil hlavou, keď som prišiel na to, kde bol problém s časom. Potom som to prerobil a už to je odvtedy v poriadku. No ale prečo ten problém vzniká?;-)

Edit: Je to jedna a tá istá chyba (to žranie chvosta. Ono totiž chvost nezožere, pretože sa posunie, ale odpočíta jednotku a to práveže nesmie.

Zpět do poradny Odpovědět na původní otázku Nahoru