El tudná-e nekem valaki magyarázni a következő Pascal programot?
Uses Crt;
Var a,b,c:integer;
Procedure adatbekeres;
Begin
Clrscr;
Write('Kérem az elsá számot: ');
Readln(a);
Write('Kérem a második számot: ');
Readln(b);
End;
Procedure Osszead(var x:integer);
Begin
x:=a+b;
End;
Procedure eredmeny(x:integer);
Begin
Writeln('A két szám összege: ',x);
End;
BEGIN
adatbekeres;
Osszead(c);
Eredmeny(c);
Readln;
END.
Természetesen tudom, hogy mit csinál a program, csak azt nem tudom, hogy miért és hogyan. A tankönyvben a mintapélda ez volt, biztosan így kell megoldani, csak némi magyarázatra szorulni számomra (és tudom, hogy egyszerűbben is össze lehet két számot adni, de a feladatot így kell megoldani)...
A kérdéseim:
Először is nagyon örülnék neki ha egy folyamatábrával (elég betűkkel és --> nyilakkal :)) össze tudná nekem hasonlítani valaki az érték és a cím szerinti paraméterátadást. És miért használjuk az elsőnél ezt, a másiknál azt?
Másrészt miért van a főprogramban "c"?
Köszönöm! :)
Hú, ezt fájt megnézni :D
Az Osszead globális változókkal dolgozik, de az eredményt egy cím szerint átadott paraméterben adja vissza? Működni működik, de ez így nagyon nem elegáns. Arra inkább egy Function kellett volna, és ennek paramétereként kellett volna átadni a két összeadandó számot.
A cím szerinti paraméterátadásnál (var kulcsszó) a változó memóriabeli címe adódik át, és ebből adódóan ha bármit megváltoztatunk azon a változón, az kihatással lesz az úgymond eredeti változóra. Érték szerintinél csak az érték adódik át, és hiába változtatod meg, az globálisan nem lesz kihatással a paraméterként megadott változóra.
Amikor az jön, hogy
Osszead(c);
akkor valójában a c globális változó címét adja át az Osszead eljárásnak, tehát azt mondja meg, hogy az eredményt majd hova tegye. A
Procedure Osszead(var x:integer);
sor azt jelenti, hogy paraméterként egy változót kap, de nem kell létrehozni lokális változóként (a var miatt), hanem csak egy hivatkozás valamilyen már létező változóra. Itt x-ként hivatkozik rá (formális paraméter), de ebben az esetben ez ugyanarra a memóriaterületre hivatkozik, mint a c. Tehát az x-be rakja az eredményt, de az valójában azonos a c-vel, mindkét szimbólum ugyanarra az értékre hivatkozik.
A másodiknál keress rá a "Cím szerinti paraméter átadás"-ra.
Ja igen, ha nem lenne ott a "var", akkor az Osszead létrehozna egy új x lokális változót, "beletenné" a kapott értéket (tehát a c egy másolatát), és azzal dolgozna. Szépen beleírná az eredményt, de mivel ez egy másik változó, az eredeti c értéke ettől nem változna meg. Amikor lefut az Osszead, akkor az x megszűnik létezni, és az eredmény elvész, nem kerül át c-be.
Mondjuk, hogy te egy Javit nevű procedure vagy, és én a fő részben "meghívlak" így: Javit(óra). Nézzünk két deklarációt a Javit eljáráshoz:
1. Procedure Javit(óra:kütyü)
Ebben az esetben a híváskor lemásolódik az óra, és te azt fogod megjavítani. Amikor elkészülsz, és hiába nézem az órámat, az még mindig rossz lesz, mert te nem azzal dolgoztál.
2. Procedure Javit(var óra:kütyü)
Itt híváskor a saját órámat fogom átadni, megjavítod, és a végén örülök. :)
A var nélküli eset akkor jó, ha csak a számításhoz szükséges információt akarom átadni. Például hogy mennyit adj hozzá valamihez, de az eredmény máshol jelenjen meg. A var akkor hasznos, ha az eredményt is ugyanebben a változóban szeretném látni.
Egy függvény tényleg elegánsabb lett volna a példában, de van, amikor nem lehet kikerülni ezt módot, például amikor több különböző értéket szeretnék visszakapni, nem csak egyet. (Próbáltam Pascal-ul gondolkodni, a C-ben pl. ez kicsit másképp néz ki.)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!