Exited with exit code 201 – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Exited with exit code 201 – Pascal – Fórum – Programujte.comExited with exit code 201 – Pascal – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
16. 5. 2009   #1
-
0
-

Zdravim!

Snažím se udělat jednoduchý program pro pohyb "jezdce" (hvězdičky) v poli, který je taková předpříprava pro můj závěrečný program v Pascalu - had. Při kompilaci mi Free Pascal nehlásí žádnou chybu, ale při spouštění programu mi vyskočí hláška "exited with exit code = 201" a dále se nedostanu.
Samozřejmě jsem googlil, ale nic konkrétního a užitečného jsem nenašel, jedná se o hodně obecnou chybu, takže tady přikládám program a budu moc vděčný za jakoukoliv pomoc při řešení mého problému :)

program pohyb;

uses CRT;
const Vlevo = #75;
Vpravo = #77;
Nahoru = #72;
ESC = #27;
Dolu = #80;
z = chr(219);
var b:array[1..20,1..40] of char;
i,j,r,s:integer;
c:char;

begin
clrscr;
for i:=1 to 20 do begin
b[i,1]:=z;
b[i,40]:=z;
end;
for i:=1 to 40 do begin
b[1,j]:=z;
b[20,j]:=z;
end;

for i:=2 to 19 do
for j:=2 to 39 do begin

r:=1;
s:=2;
b[r,s]:='*';
repeat
c:=readkey;
if c=Vlevo then begin
b[r,s]:=' ';
s:=s-1;
b[r,s]:='*';
end
else if c=Vpravo then begin
b[r,s]:=' ';
s:=s+1;
b[r,s]:='*';
end
else if c=Nahoru then begin
b[r,s]:=' ';
r:=r+1;
b[r,s]:='*';
end
else if c=Dolu then begin
b[r,s]:=' ';
r:=r-1;
b[r,s]:='*';
end;
until c=ESC

end;

for i:=1 to 20 do begin
for j:=1 to 40 do write(b[i,j]);
writeln;
end;
readln;
end.

Nahlásit jako SPAM
IP: 194.212.30.–
Quiark0
Věrný člen
16. 5. 2009   #2
-
0
-

Zkontroloval bych, jestli nezapisuješ/nečteš mimo pole b. Třeba na pozici 55, 1.

A máš debugger? Tam si můžeš program spouštět řádek po řádku, což by ti mělo pomoct problém najít.

Nahlásit jako SPAM
IP: 193.86.140.–
Grungy0
Super člen
17. 5. 2009   #3
-
0
-

No väčšinou keď to vyhodí exit code = 201 tak si v niektorej premennej prešvihol rozsah. Najlepšie spravíš ak si to odkrokuješ a budeš pozerať hodnoty premenných ale tiež je dosť možné že to bude niečo z rozsahom toho pola ako radí Quiark.

Nahlásit jako SPAM
IP: 213.215.118.–
Prvý náznak hlúposti, je pocit geniality.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
17. 5. 2009   #4
-
0
-

To Quiark :
kontroloval jsem to a nikde mimo pole bych operovat neměl, všechno je v rámci pole. Jinak Free Pascal debugger má, ale upřímně nevím, jak na něho :smile11:

Nahlásit jako SPAM
IP: 194.212.30.–
KIIV
~ Moderátor
+43
God of flame
17. 5. 2009   #5
-
0
-

To Anonymní uživatel : ver mi.. vzdy je tam o jednu chybu navic nez myslis :D

schvalne jestli najdes chybu tady:

  for i:=1 to 40 do begin

b[1,j]:=z;
b[20,j]:=z;
end;

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
17. 5. 2009   #6
-
0
-

Pak mi nejak unika princip tehle sekce (trosicku sem to preformatoval, protoze v tom plaintextu bez ladu skladu se neda moc orientovat):

  for i:=2 to 19 do

for j:=2 to 39 do begin
r:=1;
s:=2;
b[r,s]:='*';

repeat
c:=readkey;

if c=Vlevo then begin
b[r,s]:=' ';
s:=s-1;
b[r,s]:='*';
end else
if c=Vpravo then begin
b[r,s]:=' ';
s:=s+1;
b[r,s]:='*';
end else
if c=Nahoru then begin
b[r,s]:=' ';
r:=r+1;
b[r,s]:='*';
end else
if c=Dolu then begin
b[r,s]:=' ';
r:=r-1;
b[r,s]:='*';
end;
until c=ESC
end;

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Skornos0
Newbie
17. 5. 2009   #7
-
0
-

haha, právě dávám step over a přesně tam, kde si mě citoval to vyhazuje chybu pořád dokola :D jsem tam zaměnil 'i' za 'j', ale i když to napravím a spustím, tak mi naběhne akorát černá obrazovka

Nahlásit jako SPAM
IP: 194.212.30.–
Skornos0
Newbie
17. 5. 2009   #8
-
0
-

To KIIV : a co se týče té druhé části, tak tam jsem chtěl dát, aby uživatel zadal na šipkách směr a jezdec se tím směrem pohnul, nevím, jestli to je dobře, readkey jsem nikdy předtím nepoužil

Nahlásit jako SPAM
IP: 194.212.30.–
KIIV
~ Moderátor
+43
God of flame
17. 5. 2009   #9
-
0
-

me jde spise o todle:

for i:=2 to 19 do
for j:=2 to 39 do begin
r:=1;
s:=2;
b[r,s]:='*';

jako ze budes opakovat ten hlavni cyklus 18*38 krat nez dovolis uzivateli skoncit... to mas 684x zmacknout ESC nez skonci program ...

a na zaver jeste vykreslis to pole az po tech 684 ESC

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Skornos0
Newbie
17. 5. 2009   #10
-
0
-

aha, no ty 2 cykly for na určení, že pracuju uvnitř pole a potom tohle
r:=1;

s:=2;

b[r,s]:='*';

na umístění jezdce do pole

Nahlásit jako SPAM
IP: 194.212.30.–
KIIV
~ Moderátor
+43
God of flame
17. 5. 2009   #11
-
0
-

To Skornos : cimz stejne vyvstava otazka na co ty cykly ... + to co sem napsal pred chvili

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Skornos0
Newbie
17. 5. 2009   #12
-
0
-

sakra, tohle mě vůbec nenapadlo, zkusím ho zmáčknout tolikrát, jestli to je fakt pravda :D
tak fakt mockrát díky, ale jak mám pracovat v tom poli dokud uživatel nezmáčkne ESC 1x??

Nahlásit jako SPAM
IP: 194.212.30.–
KIIV
~ Moderátor
+43
God of flame
17. 5. 2009   #13
-
0
-

To Skornos : vzdyt v nem pracujes ... jediny co na to potrebujes sou ty indexy [r,s]...
a po stisku prekreslit...
vsechno ale uvnitr repeat...

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Skornos0
Newbie
17. 5. 2009   #14
-
0
-

Tak tohle je divné - v celoobrazovkovém režimu se mi pole zobrazuje vyplněné bílými pruhy a v normálním zmenšeném okně jsou vyplněné jen okraje a uvnitř je pole prázdné, jak má být

Nahlásit jako SPAM
IP: 194.212.30.–
Skornos0
Newbie
17. 5. 2009   #15
-
0
-

a ještě mě napadlo: jak by se dal udělat samostatný pohyb jezdce v daném směru, který by si udržel, dokud nezmáčknu jiný směr (alá had)? Chtěl jsem dát repeat k podmínce, kde píšu daný směr a ještě delay, aby to neskočilo rovnou vpřed, ale vždycky dostanu zase exitcode 201. Program vypadá tedka takhle:

program pohyb;

uses CRT;
const left=#75;
right=#77;
up=#72;
down=#80;
esc=#27;
z=chr(219);
var b:array[1..10,1..20] of char;
i,x,j,r,s:integer;
k:boolean;
c:char;
procedure vlevo;
begin
b[r,s]:=' ';
s:=s-1;
b[r,s]:='*';
end;
procedure vpravo;
begin
b[r,s]:=' ';
s:=s+1;
b[r,s]:='*';
end;
procedure dolu;
begin
b[r,s]:=' ';
r:=r+1;
b[r,s]:='*';
end;
procedure nahoru;
begin
b[r,s]:=' ';
r:=r-1;
b[r,s]:='*';
end;
begin
clrscr;
for i:=1 to 10 do begin
b[i,1]:=z;
b[i,20]:=z;
end;
for j:=1 to 20 do begin
b[1,j]:=z;
b[10,j]:=z;
end;
r:=5;
s:=10;
b[r,s]:='*';
repeat
clrscr;
for i:=1 to 10 do begin
for j:=1 to 20 do write(b[i,j]);
writeln;
end;
c:=readkey;
if c=left then {dal jsem repeat} vlevo
{until keypressed nebo ještě until (c=right) or (c=up) or (c=down)}
else if c=right then vpravo
else if c=up then nahoru
else if c=down then dolu;
if c=z then begin
write ('konec');
readln;
end;
until c=esc;
end.

Nahlásit jako SPAM
IP: 194.212.30.–
Mircosoft+1
Věrný člen
18. 5. 2009   #16
-
0
-

Bile pruhy jsou zpusobene nejspis tim, ze vnitrek pole na zacatku programu neinicializujes. Okraje jsi vyplnil znakem #219, ale s vnitrkem jsi nedelal nic, tak tam pravdepodobne zustala hodnota #0, coz se zobrazuje jako bily obdelnicek.


Jestli chces, aby ten "had" bezel porad, i bez mackani klaves (klavesy by jenom menily smer), tak by to melo vypadat nejak takhle:

repeat

* zkontroluj klavesy a pripadne podle nich zmen aktualni smer;
* aktualni polohu zmen podle aktualniho smeru;
* vsechno vykresli;
* chvilku pockej;
until c=esc;

Cili:
* Kontrolu klaves zabal do cyklu while keypressed do ... (jestli Keypressed hodi false, uzivatel nic nestiskl a Readkey by na stisk cekal, coz asi nechces). Uvnitr pak normalne c:=readkey a zpracuj ho. While misto logicky predpokladaneho ifu tam davam proto, ze sipky vraceji dva znaky - jako prvni #0 a az jako druhy ty kody, ktere mas na zacatku programu. Je potreba precist postupne oba, jinak by had reagoval se zpozdenim.

* Je vyhodne ulozit si smer jako cele cislo (vyuzity rozsah treba 1..4) a nadefinovat si pole s prirustky souradnic, do kterych jako index dosadis aktualni smer a na prislusne pozici rovnou prectes, o kolik se mas posunout:
const

doprava=1;
nahoru=2;
doleva=3;
dolu=4;
vx:array[1..4] of shortint=(1,0,-1,0);
vy:array[1..4] of shortint=(0,-1,0,1);

Predpokladam, ze ti souradnice y pribyva odshora dolu a x zleva doprava. Hodnoty k nazvum smeru muzes samozrejme pojmenovat i jinak.
Potom tedy mas promennou, dejme tomu var Smer:byte. Podle nactene klavesy ho jednoduse prenastavis:
case c of left:smer:=doleva;

right:smer:=doprava;
...


* Posun hada by mohl vypadat naprosto jednoduse:
r:=r+vy[smer];

s:=s+vx[smer];

Ale napred je potreba osetrit pripad, kdy had dojel na kraj pole - pokud s+vx[smer] nebo r+vy[smer] vychazi mimo rozsah, had vyjel a pohyb se musi zrusit.

* Pozici hada neni potreba ukladat v hernim poli - staci, ze znas jeho souradnice. Muzes vykreslit pole, potom se pres Gotoxy dostat na spravnou pozici na obrazovce a vypsat hvezdicku.

* Na cekani se da pouzit treba prikaz Delay. Do zavorky das, kolik milisekund chces cekat. Pro tenhle pripad bych pro zacatek volil neco kolem 400, vhodnou hodnotu zjistis pokusne. Jo, a pozor, ze vsechny stisknute klavesy se behem cekani ukladaji, takze ti jich v jednom cyklu muze prijit vic nez jenom jedna nebo dve. Otazkou je, jestli je v kazdem cyklu vyhodnotit vsechny, a nebo vzdycky cist jenom jednu, coz dostatecne rychlemu hracovi umozni natukat si nekolik zatacek do zasoby.


A jestli to ma byt had, budes urcite potrebovat pamatovat si souradnice vsech jeho clanku, abys je mohl postupne umazavat. Typicky priklad vyuziti datove struktury typu fronta :-). Docela hezky to jde s jednosmernym spojovym seznamem (pak se nemusis patlat s omezenim delky, posouvanim indexu v poli, preskakovanim z konce na zacatek a podobne, jako by to bylo nutne u pole).

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Skornos0
Newbie
18. 5. 2009   #17
-
0
-

Páni, tak vidím, že tady jsou všichni nápomocni, tohle jsem vážně nečekal, myslím, že s informacemi, které si mi, Mircosofte, poskytnul, bych to už snad mohl zvládnout :) Tak vážně díky

Nahlásit jako SPAM
IP: 194.212.30.–
Skornos0
Newbie
19. 5. 2009   #18
-
0
-

Tak jsem to zatím udělal po svém a z toho Mircosoftova si vzal část, ale zase jsem narazil na zcela hloupý problém, ke kterému nikde nevidím řešení:(
Při pohybu jezdce doleva a doprava je všechno ok, ale při pohybu nahoru a dolů se mi mezi jednotlivými články vynechává mezera jeden řádek a při nárazu do zdi taky je vše zleva doprava v pořádku, ale při nárazu nahoře nebo dole mi had "narazí" o řádek dříve, což předpokládám souvisí s mezerami mezi články. Zkoušel jsem nastavit stejnou šířku a výšku podle, změnit parametry posunu (kdyby šel posun o půl řádku, tak by bylo myslím si po problému), ale nic nepomáhá

Nahlásit jako SPAM
IP: 194.212.30.–
Mircosoft+1
Věrný člen
20. 5. 2009   #19
-
0
-

Hmm... napadaji me dve moznosti.

1) Pohyb funguje bez problemu, ale opticky to vypada divne. V normalnim textaku 80x25 je vyska radku zhruba dvojnasobek sirky znaku, cili zhruba takhle:
***
*** (3x3 znaky, ale vidis, ze ctverec to rozhodne neni)
***
Proste to svisle skace o vetsi kusy nez vodorovne a s tim celkem nic nenadelas.
Mozne reseni:
a) Misto * pouzit dva znaky vedle sebe, treba [ ], ( ) nebo nejake obdelnicky z konce ASCII tabulky (ale pak bys musel zkrouhnout sirku herniho pole na pulku).
b) Nastavit si textovy rezim 80x50 (prikaz Textmode z jednotky CRT).

2) Nekde tam omylem pouzivas Writeln misto Write.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Skornos0
Newbie
20. 5. 2009   #20
-
0
-

Fajn, tak textmode(259) pomohl, opět dík :)

Nahlásit jako SPAM
IP: 194.212.30.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Exit code 201 - jízdenky — založil Lukáš

Exit?? — založil cp.Hook

Polynom - run-time error 201 — založil danny04

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý