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.

Předmět Autor Datum
Asi by si to mal dat na iny server lebo z toho kde to mas sa mi to nestiahlo ani za pol hodinu (rych…
MM.. 08.06.2006 16:43
MM..
Máš to rozbitý. :)) Staženo za 2 vteřiny.
karel 08.06.2006 16:46
karel
Nemam to rozbity, ten server (celkovo webzdarma.cz) ma problem so spojenim do zahranicia, uz hodne d…
MM.. 08.06.2006 16:55
MM..
Uploadnuté aj na wurmi.zip.
msx. 08.06.2006 17:27
msx.
forbidden :-D kasli na to, ja si to nejak stiahnem z webzdarma...
MM.. 08.06.2006 18:06
MM..
Tu to bude myslím 2 týždne: http://edisk.cz/stahni/03c077bed645256d6fde9122d000 ece5cb875631 BTW, I…
msx. 08.06.2006 20:30
msx.
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..
Hint: Stačí si zahrať a určite sa niečo nebude pozdávať. Autor komentáre za luxus nepovažuje, len v…
msx. 09.06.2006 16:22
msx.
Zahral som si a ziadnu chybu som nevidel :-) Napis co nejde napisem ti kde je chyba v zdrojakoch :-)…
MM.. 09.06.2006 17:27
MM..
Stiahlo sa to normalne. Spustil som to v XP a fungovalo to normalne i so speakerom. Ked ten cervik n…
Andrej 09.06.2006 19:49
Andrej
To nie je chyba ale schvalne naprogramovane ... case a[x,y] of ... body: while a[x,y] = body do beg…
MM.. 10.06.2006 03:31
MM..
Schválne je naprogramované vlastné "zožranie sa", ale nemá to z hry vyhodiť.;-)
msx. 11.06.2006 02:42
msx.
Ved vidim ze to nema z hry vyhodit, ale je utrpenie v takom programe/premennych hladat chybu. Ale mo…
MM.. 11.06.2006 16:04
MM..
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 nadstav…
msx. 11.06.2006 17:03
msx.
Ano, tak. Pomocne premenne stacia i,j,k apod. ;-) By som povedal ze aj tu vidno prinos OOP, ktore nu…
MM.. 11.06.2006 17:09
MM..
tak to prrrrr...... "Extreme Programming" neni zadny "rychlo napisat cokolvek bez konceptu":!: :>:ww…
Ynd0r 11.06.2006 17:26
Ynd0r
Ten prvý link mi umožnil pochopiť ako prišiel Windows k názvu.:-D Windows eXtreme Programming
msx. 11.06.2006 17:59
msx.
xpfaq.html ;-)
Ynd0r 11.06.2006 18:10
Ynd0r
Ale hodilo by sa to nie?:-D
msx. 11.06.2006 18:26
msx.
No hej ale ak sa zacina uplne najjednoduchsim co moze fungovat ked clovek ani nepozna celu funkciona…
MM.. 11.06.2006 18:21
MM..
No hej ale ak sa zacina uplne najjednoduchsim co moze fungovat... ..myslis simple.html ? Mas pravdu…
Ynd0r 11.06.2006 18:34
Ynd0r
V OOP sa ani programovať s ničnehovoriacimi názvami nedá. Takže tam už programujem "vzorne".;-)
msx. 11.06.2006 17:58
msx.
Takže trvalo to 11 hodín čistého času (preto chýbajú komentáre). Áno je to prvá logická chyba. Už le…
msx. 11.06.2006 02:41
msx.
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.
Inac jedna chyba (ale nie moc zavazna) je IMHO tuto: eat: begin writechar(x,y,0,free); wl := wl +…
MM.. 11.06.2006 16:42
MM..
Pôvodne som si myslel, že tie chyby sú 3. Keď som hľadal v zozname opravených chýb, tak na tú tretiu…
msx. 11.06.2006 16:55
msx.
Urob radsej hned verziu 5.0, ale prepis to uplne odznova, a slusne :-), fakt nebudes mat taketo prob…
MM.. 11.06.2006 17:08
MM..
Verzia 4 je zatiaľ v štádiu prípravy vzhľadu menu a dnes som kreslil obrázky. Teraz idem ešte len kó…
msx. 11.06.2006 17:56
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…
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…
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.

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

...
  case a[x,y] of
...
    body:
      while a[x,y] = body do
        begin
          writechar(wx[w1],wy[w1],0,free);
          inc(w1);
          if w1 > wmax then w1 := 0;
          wl := wl - 1;
          writewl;
          snd(500,20);
        end;

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).

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 :-D 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 :-D

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 :-D P.S. extreme programming je sice cely koncept, a ma to aj dost zaujimave idey, mam pocit ze vysledok moc presvedcivy nebude :-D

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"... :-D

No hej ale ak sa zacina uplne najjednoduchsim co moze fungovat...

..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.

Inac jedna chyba (ale nie moc zavazna) je IMHO tuto:

    eat:
      begin
        writechar(x,y,0,free);
        wl := wl + 1;
        writewl;
        snd(250,20);
        repeat
          x := random(30) + 1;
          y := random(28) + 1;
        until a[x,y] = ' ';
        writechar(x,y,ceat,eat);
      end;

- 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 :-D
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 :-D

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