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.
Asi by si to mal dat na iny server lebo z toho kde to mas sa mi to nestiahlo ani za pol hodinu (rychlost stahovania asi tak 1 byte za sekundu :).
Máš to rozbitý.
Staženo za 2 vteřiny.
Nemam to rozbity, ten server (celkovo webzdarma.cz) ma problem so spojenim do zahranicia, uz hodne dlhu dobu (rychlost ktoru som napisal cca. zodpoveda rychlosti toku dat z toho servera do D )
Uploadnuté aj na wurmi.zip.
forbidden kasli na to, ja si to nejak stiahnem z webzdarma...
Tu to bude myslím 2 týždne:
http://edisk.cz/stahni/03c077bed645256d6fde9122d000 ece5cb875631
BTW, IgorK, ty máš dobré miesta na webe, nehodíš to niekam?
To ozaj nikto nedokáže stiahnuť alebo ste to nechali tak?
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 Este dobre ze tam nie su premenne s nazvami aa, a1, aa1, a2, a3, a4, a5, a6
Ale hra je to pekna, dokonca mi isla aj na W2k aj so zvukom so speakeru som az cumel.
Hint: Stačí si zahrať a určite sa niečo nebude pozdávať. Autor komentáre za luxus nepovažuje, len v rýchlosti na ne zabudol (ja).
Zahral som si a ziadnu chybu som nevidel Napis co nejde napisem ti kde je chyba v zdrojakoch
Resp. radsej nie, ptz ten program je od urciteho bodu takmer necitatelny, kvoli tym globalnym premennym a ich nazvom, keby som mal za ulohu to opravit tak to cele zmazem a urobim to slusne a tym padom bez chyb na prvy pokus ;)
Stiahlo sa to normalne. Spustil som to v XP a fungovalo to normalne i so speakerom. Ked ten cervik narazi na svoj stale sa zvacsujuci chvost tak sa hra neukonci ale pokracuje dalej a skrati jeho chvost a taktiez sa znizi o tuto dlzku pocitadlo vpravo hore na obrazovke. Ked som to skusal niekolko krat za sebou tak ma to nakoniec z hry vihodilo. Mozno to sposoblili i nejake ine programi co mi tu bezia.
To je zatial jedina vec ktoru som si vsimol.
Neviem kolko casu zabralo autorovi programovanie tejto hry ale ja zo svojimi sucasnymi znalostami by som to urcite nenaprogramoval.
To nie je chyba ale schvalne naprogramovane
ale fakt sa mi nechce lustit v tej kope glob.premennych ci niekde nezomotal premennu aka tam nema byt (alebo preco ta to potom z hry vyhodilo).
Schválne je naprogramované vlastné "zožranie sa", ale nemá to z hry vyhodiť.
Ved vidim ze to nema z hry vyhodit, ale je utrpenie v takom programe/premennych hladat chybu. Ale mozno ma dnes premoze masochisticka nalada ked sa budem moc nudit, a najdem ti to Pre buducnost nepouzivaj globalne premenne, nazvy premennych a funkcii tak aby bolo jasne co je v nich ulozene / co robia, a najdolezitejsie: kedze nebudes mat glob.prem. tak budes vediet kazdu funkciu skontrolovat osobitne ci robi to co chces aby robila (nezavisle na zvysku pgm), a tym padom budes vediet do urcitej miery garantovat ze pgm neobsahuje chyby.
A keby to robil MS tak ako pisem tak by nemohli Win obsahovat 40000 znamych chyb
V TP som bol zvyknutý na krátke názvy premenných ako sú aj v tu. Keď som sa začal zaujímať o nadstavbu Turbo Vision ("predchodca" Object Pascalu, ale pod DOSom), tak tam som začal aj výstižnejšími názvami. No a v Delphi vďaka Code Insight používam už radšej výstižnejšie názvy. Nič nehovoriace názvy používam na dočasné premenné ako cykly, počítadlá, prípadne lokálne objekty v procedúrach, ak sa nejedná o veľmi dôležitý objekt (napr. dočaný objekt na uloženie adresy objektu, s ktorým idem pracovať).
Ano, tak. Pomocne premenne stacia i,j,k apod. By som povedal ze aj tu vidno prinos OOP, ktore nuti programatora takto (vola sa to "extreme programming" - rychlo napisat cokolvek bez konceptu) neprogramovat P.S. extreme programming je sice cely koncept, a ma to aj dost zaujimave idey, mam pocit ze vysledok moc presvedcivy nebude
tak to prrrrr...... "Extreme Programming" neni zadny "rychlo napisat cokolvek bez konceptu"
www.extremeprogramming.org
Extreme_programming
Ten prvý link mi umožnil pochopiť ako prišiel Windows k názvu.
Windows eXtreme Programming
xpfaq.html
Ale hodilo by sa to nie?
No hej ale ak sa zacina uplne najjednoduchsim co moze fungovat ked clovek ani nepozna celu funkcionalitu, tak si tazko moze navrhnut slusny datovy model atd. Je to na polemiku, pisal som (sice az v P.S.) ze aj XP ma zaujimave a uzitocne myslienky, ale co z toho vyleze za produkt, hmm no neviem, moze sa to aj osvedcit, nehadam sa, hlavne to asi imponuje ludom z marketingu, ktori potrebuju rychlo rychlo predat nieco co ako tak funguje a potom nechapu co tam este ten programator tolko robi, ved to predsa uz pred mesiacom "fungovalo"...
..myslis simple.html ?
Mas pravdu, ze kazdej na to muze mit jiny nazory, ale celkove mi ta filozofie xp pripada dost dobra, rozhodne si nemyslim, ze by nejak znesnadnovala navrh slusnyho datovyho modelu. Celkove mi ty pravidla prijdou dobre vymysleny, kdyz se ma neco udelat - a rozhodne ne s kompromisama v kvalite, spis naopak.
V OOP sa ani programovať s ničnehovoriacimi názvami nedá. Takže tam už programujem "vzorne".
Takže trvalo to 11 hodín čistého času (preto chýbajú komentáre). Áno je to prvá logická chyba. Už len zistiť, prečo je to tak.
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ž.
Inac jedna chyba (ale nie moc zavazna) je IMHO tuto:
- moze sa stat ze nove nahodne x,y pre "eat" bude rovnake ako pozicia hlavy (povodne x,y), a na konci fcie to prepises hlavou, t.j. od toho momentu bude o jedno "eat" na poli menej.
Pôvodne som si myslel, že tie chyby sú 3. Keď som hľadal v zozname opravených chýb, tak na tú tretiu som si nevedel spomenúť a potom som si myslel, že som si to len zle pamätal. Takže nakoniec si našiel aj tú tretiu. Teraz je to totiž vo verzii 3.0 a všetky tieto spomínané chyby už sú opravené. Momentálne "pracujem" na verzii 4.0 pre Windows. Keď to bude hotové, tak zverejním.
Urob radsej hned verziu 5.0, ale prepis to uplne odznova, a slusne , fakt nebudes mat taketo problemy, najprv rozmyslat, predstavit si v hlave nejaky logicky, jednoduchy a citatelny koncept riesenia ciastkoveho problemu (t.j. jednej fcie), az potom pisat. Napr. ta fcia writewurmi by sla napisat omnoho citatelnejsie a logickejsie, a vyhol by si sa problemom, teraz musi clovek pozerat pol hodinu na tych 10 riadkov aby si v hlave prekombinoval vsetky moznosti a nasiel tu jednu v ktorej je chyba...
P.S. ten pgm mi nejde na mojom Athlon2400+ s GF4400Ti ani v DOSe (namiesto znakov mam nejake ciarky po obrazovke, reaguje na klavesnicu vsetko ok ale nevidim to co by som mal), je na to nejaky figel aby to vykreslovalo spravne?
//edit: beriem spet, funguje to dobre ak zadam Start-Vypnut-restartovat v mode MS-DOS (Win98SE), asi kvoli nejakym ovladacom. Tak sa idem trochu s tym zahrat
P.S.2. Ta hra je celkom pekne vymyslena, myslim ze by mali o to ludia zaujem (ako relax), ale sa musi dat vypnut zvuk, v praci zvuk vyrusuje kolegov
Verzia 4 je zatiaľ v štádiu prípravy vzhľadu menu a dnes som kreslil obrázky. Teraz idem ešte len kódovať.
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.
Presne tak. Samozrejme to je už opravené. No a ešte ostala tretia chyba. Tú zatiaľ nikto nespomenul.
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:
alebo jednym riadkom
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:
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 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 )
No to súvisí s tým žraním vlastného tela. Opravou tej chyby sa opravilo aj toto.
Hint pre tretiu chybu: Koľko sekúnd je 5 minút?
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.