
Pascal - volání metody
Ahoj, tvořím program v Pascalu a nevím si rady. Program má pouze 1 třídu. V kodu jsem vytvořil metodu, když pustím program a metodu zavolám, tak proběhne správně, ovšem, když metodu zavolám na jiném místě v kodu, tak už metoda nefunguje. Nechápu jak je to možné...jinak chybu to hlásí: EAccessViolation with message 'Access violation at address 004048D0 in module'hra.exe'. Read of address 20202018'. Strávil jsem nad řešením několik hodin, a pořád to nedává smysl...alespoň mě ne. Někomu tady ano? Děkuji za rady a tipy
Pokud má program třídu (dejme tomu TTrida), musíš vytvořit objekt, napr. ObjektTrida
Pak k metodam pristupujes pres jmeno vytvoreneho objektu: ObjektTrida.Metoda
To je mi jasný. V tom chyba není. Prostě mam metodu, která načítá ze souboru do pole. Funguje správně, ovšem, když ji zavolám jindy, než na začátku programu, tak se to posere u toho načítání. Hned jak to má začít.
Bez kódu žádná další rada nebude.
Access violation obvykle znamená, že přistupuješ k něčemu, co ještě nebo už neexistuje
zde
Zde je projekt ke stažení, v souboru problém je problém popsán a osvětlen :)
Z toho popisu jsem teda nechopil kde a kdy to přesně padá. Pokud chceš pomoct, tak musíš být co nejpřesnější.
V metodě cíl, to začíná výpočtem bodů, pod tím by se měla zavolat metoda zapisVysledek; a výsledky ukončeného závodu by se měli zapsat do pole. Ovšem v tu chvíli kdy to skočí do metody zapisVysledek, a má se začít načítat obsah pole ze souboru, tak to spadne. Stačí takto?
Nějak nevidím, že by se v proceduře cil volala procedura zapisVysledek.
BTW: nepoužívej pojem metoda, ten patří do objektového programování.
jo, já to tam měl, pak zase ne, tak to tam tedka není, stačí to tam dopsat a bude to.... tak tam dej zavolat tu proceduru a uvidíš sám
Kdyz to spustim, tak to po vyberu z typu hry nic neudela a normalne se to ukonci.
Jak mam postupovat, abych se dostal k chybe?
Je celý obsah RARu v jednom adresáři?
Ano, presne jak jsi to poslal.
Jen jsem to prelozil, spustil, vybral hrat, zadal jmeno, vybral hru, potvrdim a program skonci.
To se mi nestává, nevím, kde je chyba.
Treba Pole je deklarovane jako
pole: array[1..50,1..21] of char;
Ale nacitas do nej drahu, ktera ma 122 radku (tve soubory, ktere jsi poslal)
Ted uz se mi to spustilo, ale podle tveho popisu k chybe nikde nedoslo.
Az posles program, ktery chybu vykazuje, je funkcni a bude napsan postup, jak se k chybe dostat, muzeme pokracovat.
procedure THlMenu.cil;
begin
body := bonus + vzdalenost;
ClrScr;
GoToXY(20,5);
tuhle část uprav na
procedure THlMenu.cil;
begin
body := bonus + vzdalenost;
zapisVysledek;
ClrScr;
GoToXY(20,5);
A až dojedeš závod, tak se budou chtít načíst výsledky a zapsat tam ten aktuální, ovšem to se nastane, při načítání výsledků do pole program spadne...
Nespadne. Napise, ze doslo palivo, dostal jsem body a zobrazi se nabidka.
Pokud chces pomoct, posli primo verzi, ktera nefunguje.
No tak abys dojel do cíle, tak bud musíš sbírat palivo a nebo si na 153 řádku zvýšit počet paliva na 150 a jen se vyhýbat překážkám..
To by ta hra musela fungovat.
Tak jak ji mas napsanou, tak precte prvnich 50 radku z programu a pak spadne, protoze pole mas deklarovane na 50.
Na klavesy to nijak nereagovalo. Takze urcite nemuzu dojet na 153 radek.
Takze bud posles aktualni verzi (a ne neco, co jsi nekde vyhrabal), ktera funguje a ktera "nekde" pada a muzeme hledat problem nebo s tim jednoduse nebudu ztracet cas.
Po zvyseni paliva v programu jsem dojel do cile a program se ukoncil, nevratil se do menu. Ja ted taky koncim, dokud neposles neco, co aspon trosku funguje
Hra zcela funguje. Ano přečte sice 50 řádek, ale stejnak jich najednou více nezobrazím, tak jich načítám 50, pak dalších 50, ale jiných, aby se dráha posouvala.. Používáš klávesy a a d?
No právě že se dojede do cíle a hra spadne, to je ten problém, protože to skočí do toho načtení a uložení výsledků a tak se to posere.
Tohle je tvoje nacitani drahy:
Vysvetli mi, kde tam prosim nactes prvnich 50? Podle mne nikde. Ctes do konce souboru a pri 51 nacteni to zhuci, protoze pole je 1..50.
Ano, pouzivam klavesy 'a' a 'd'. Nikde nevidim v prubehu hry pozici auta a i kdyz mackam porad 'a' tak se mi nikdy nepodarilo narazit do zdi.
Takze opakuju naposledy.
Posli verzi, ktera neco dela. Do te doby proste nebudu reagovat.
Vysvetli mi niekto ze preco si pri tej excepsne nepozre v debuggeri ze co mu to sposobilo?
Mě to prostě na notebooku funguje normálně, i na kamarádovo PC. Nevím, kde je problém. Mohu klidně udělat i video, ale to stejnak nic moc neřeší...
Kde je problem najdes v tom debuggeri. OMG. 1minuta debugger vs. 250 hodin diskutovania.
Chápeš, že na 2 místech volám stejnou proceduru, a jednou funguje a jednou ne? Vím na kterém řádku je chyba, ale nechápu proč.
Chápeme pouze to, že se bavíš o verzi, kterou máš u sebe na počítači a nám "blbečkům" jsi poslal úplně něco jiného.
Ono to kludne moze byt ten samy program akurat to vsetko zavisi na inych XY veciach. Chyba sa vysetruje tam kde nastava.
Vzhledem k tomu, ze mluvi o nacitani prvnich 50 radku, ze jsem musel opravovat zdrojak podle nej atd. to na stejny program nevypada...
v debuggeri si mozes pozret riadok priamo na ktorom to nastalo, riadok vnutri procedury. Mozes si pozret indexy, adresy, stack, premenne, konkretny riadok, a potom vidis preco pristupuje na tu adresu.