Pascal: Miért ugorja át a read parancsot?
Sziasztok.
Kell írnom egy komplikáltabb programot de abba a problémába ütköztem hogy mikor másodjára akarom egy tömb elemeit beolvastatni for ciklussal akkor a read parancson átmegy, persze akkor ha a tömb kitevője string, ha integer akkor működik. A program eleje felé is van egy ugyan ilyen ciklus ami hibátlanul megy és ezt másoltam át a program vége fel, persze a változók változtatásával. Miért lehet ez? miért megy integerrel és stringgel nem?
Turbo pascalt használok, free pascalba működne?
Kedves kérdező: ez egy fórum, szóval ne privát üzenetbe küldd a forráskódot, mert azzal másokat is segíthetsz.
Idézném a leveledet (a teljes "forráskódra" (azért jelzem idézőjelek között, mert az indentálás inkonzisztenciája miatt kissé olvashatatlan volt) mutató linket - a kedvedért - kicsillagoztam - ennek oka majd a levélből talán érthető):
"Szia! Nem szeretném a programot nyilvánossá tenni, ez egy házi lenne és nem szeretném ha a többiek is rábukkannának, remélem nem gond. Feltöltöttem, itt a link:
********
Hogyha lejár a határidő akkor kirakom a fórumra is, csak addig nem szeretném míg nem jár le a határidő.
A program bekér 2 kívánságlistát, az elsőt amit a gyerek mond azt be tudja olvasni de amit később a szülő adna meg hogy mit venne a gyereknek nem akarja, átugrik a read parancson és sorba kiírja hogy 1...x elem.
Free pascalban már az elején megakad a program.
remélem tudsz egy kicsit segíteni.
Elsőre is köszi a segítséget!"
No tehát:
1. Free Pascal 3.0.0+dfsg-2 [2016/01/28] (64 bites xUbuntu 16.04-ból használva) alatt lefut a program (és igen, a második cikluson átfut).
2. A program elején az alábbi ciklus található:
a végén meg ez:
szóval nem nagyon hasonlítanak.
Hogy a második ciklus is ugyanúgy működjön, így kell kinéznie:
Bár kicsit szebben nézne ki így:
Még egy kicsivel szebben: if j > 0
Egyébként meg -- igaz, nem láthatok bele a program rejtelmeibe, de -- nem értem ennek az ifnek a jelentőségét, ami miatt a javított változatban a beolvasás után a képernyőn azonnal felülíródik a nulladik kérdés. Így kívülről inkább az tűnik logikusnak, hogy a ciklus egyszerűen 1-ről induljon, és a kérdések sorban egymás alá kerüljenek, valahogy így:
x := 5;
y := 9;
GotoXY(x,y);
for j := 1 to szulo do
begin
Inc(y);
Write(j,'. elem: ');
ReadLn(b[j]);
GotoXY(x,y);
end;
Persze lehet, hogy ez a bizonyos nulladik elem más természetű, és ezért különleges esetként kezelendő, de ez a kódrészletből nem derül ki. Ebben az esetben viszont illendő lett volna néhány szóközzel törölni a beolvasott szöveget, hogy ne zavarja az ugyanott bekért következőt.
Köszönöm a válaszokat.
Letöltöttem a free pascal 3.0.0-ás verzióját de sajnos mikor abba bemásolom a forráskódot egy exitcode 201-es hibaüzenettel kilép az utolsó cilkus előtt amit a turbo pascal-ban nem produkált. Kicseréltem az utolsó ciklust arra amit ajánlottatok de turbo pascalban sem akar rendesen működni.
A ciklusok elején az if-re azért volt szükségem (lehet ez az én turbo pascalom hibája) mert folyton átment az első cikluson és a másodikkal kezdte, így ezzel elértem azt hogy 1-ről induljon.
Viszot a free pascalban ugyan ezt produkálja, nem veszi az első ciklus read parancsát.
Én Win 7 Pro-n free pascal 3.0.0 és turbo pascal 7-tel próbálkoztam.
Legelőször is olvasd fel magadnak hangosan a saját kérdésedet, legalább háromszor, hogy örökre bevésődjenek a tanulságai.
Megvan? Akkor engedelmeddel: Azt állítottad, hogy gyakorlatilag semmit sem módosítottál a cikluson, pedig alapvetően megváltoztattad a szerkezetét. Megállapítottad, hogy az egyetlen különbség a változók típusában van, holott ennek láthatólag semmi szerepe. Az ezerszer bonyolultabb feladatokra is alkalmas fordítóprogram cseréjétől vártál valami transzcendens megoldást, pedig ennek csak akkor lenne értelme, ha ismernéd a korlátait, és rá tudnál mutatni, hogy a programod hol ütközhet beléjük.
Hát EZÉRT kell mindig kódot is mellékelned, amikor tanácsot kérsz. Te már belelovaltad magad a problémába, ezért nem tudod elfogulatlanul megítélni sem, ismertetni sem: Nem magát a gondot-bajt közlöd, hanem az ezzel kapcsolatos saját feltételezéseidet.
Most megint itt tartunk. Fogalmam sincs, hogy mi az, ami a túlcsordulást okozza, de így nem is fog kiderülni -- lám, most meg a Free Pascal a hunyó. Azt meg el kell hinnünk becsszóra, hogy a kódrészleteket hibátlanul, a működésüket tökéletesen megértve igazítottad a helyükre, és merő bitpocsékolás lenne ezt ellenőrizhető formában bemutatni, hiszen a tökélyt gáncs nem érheti. Az iffel kapcsolatos magyarázatodból meg egy kukkot sem értek, csak azt, hogy nyilván megint az a nyavalyás TP a ludas...
Nyeld le azt a békát, hogy igenis, te is képes vagy hibázni, és ha a munkád eredménye nem úgy sül el, mint vártad, akkor a programodat kell megvizsgálni, nem pedig a hozzá fűzött kétes értékű kommentárjaidat. Elismerem, a Turbo Pascal már egy kissé divatjamúlt, ezért csak javasolható a Free Pascalra váltás, de legyen világos: A te szinteden még semmiféle lényegi különbséget nem volna szabad tapasztalnod a kettő között. Akárhogyan is, de a programodban van a hiba.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!