Kezdőoldal » Számítástechnika » Programozás » Mikor kell cím szerinti...

Mikor kell cím szerinti paraméterátadást használni?

Figyelt kérdés
c++-ban "programozok", nem rég kezdtem, de nagyon érdekelne, szeretnék ezzel foglalkozni is majd később, de egy gondom van..Nem tudom mire jó ez a cím szerinti paraméterátadás. Videotutorialrol és könyvből tanulok de az semmit nem említ rá.Mikor kell használni és miért?
2014. febr. 9. 20:45
 1/5 anonim ***** válasza:
semmit sem kell, lehet használni
2014. febr. 9. 20:50
Hasznos számodra ez a válasz?
 2/5 A kérdező kommentje:
addig jó, de miért "lehet" akkor? vagy mikor érdemes?
2014. febr. 9. 21:02
 3/5 iostream ***** válasza:

Nincs olyan, hogy cím szerinti paraméterátadás. C-ben csak érték szerinti volt, C++-ban pedig csak úgymond inicializálás szerinti paraméterátadás van.


Amúgy amire gondolsz azt két esetben használjuk: ha nem lenne hatékony lemásolni az objektumot vagy ha kimenő paraméterként akarod használni.

2014. febr. 9. 23:06
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:
87%

Paraméter átadáskor a paramétereket vagy regiszterekben adjuk át, vagy a veremben helyezzük el őket. Regiszterek esetében a regiszterek állapotát el kell menteni, majd hívás után vissza kell állítani. Veremben történő átadás esetén pedig a vermet kell visszaállítani, azaz ugyan annyi méretű adatot kell kivenni (pop), mint amennyit a hívó fél belehelyezett (push).


Elméletileg két féle paraméter átadás lehetséges, aszerint, hogy az átadott paramétereket ki törli (szabadítja fel). Az x86 ararchitektúrán a következő konvenciók vannak:


A hívó fél szabadítja fel:

* cdecl (A C nyelv konvenciója, verem alapú.)

* syscall (OS/2 API konvenciója, cdecl alapú.)

* optlink (IBM fordítók konvenciója, az első három paraméter az EAX, ECX és EDX regiszterekben van, a többi a veremben.)


A hívott fél szabadítja fel:

* pascal (Olyan mint a cdecl csak fordított sorrendben adja át.)

* register (Néhány Linux kernel és Borland nyelvek konvenciója, az optlink megoldást követi.)

* stdcall (MS Win32 API sajátja.)

* fastcall (gyors de platformfüggő.)

* safecall (Delphi-s stdcall megoldás.)


Bármelyik fél felszabadíthatja:

* thiscall ( A C++ nem statikus metódus hívásainál használják, GCC fordító esetén cdecl-el ekvivalens. MS VC++ esetén a this pointer az ECX regiszterbe kerül, és a hívott szabadít vel.)


Ahogy látod, paraméter átadáskor a paraméterben átadott változó értéke mindig lemásolódik, azaz a hívott szubrutin (függvény) nem az eredeti változón operál. Ha egy függvény módosítja a paraméterben megkapott változóját, az nincs hatással az hívó fél hatáskörében használt (átadott) változó értékével.


A cím szerinti paraméterátadás arra való, hogy a paraméterben átadott változót, vagy objektumot módosítani tudjuk. Ezt úgy érjük el, hogy nem magát a változó értékét adjuk át, hanem azt a memóriacímet ahol a változó található. Ezt a címet felhasználva módosítani tudjuk ez eredeti változó értékét. A függvény hívás végén, a hívó hatáskörében az átadott változó így változhat.


C++ esetén van lehetőség referencia szerinti paraméterátadásra is. Ez nagyon hasonlít a cím szerinti átadásra, de valamivel biztonságosabb. Ennek oka, hogy egy referencia (a Java-s és C#-os terminológiával ellentétben) mindig egy objektumra mutat. A C++ nyelvben nincs null referencia.

2014. febr. 10. 11:06
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:

Köszönöm mindenkinek!

Utolsó: köszi a részletes magyarázatot, így már szerintem értem:D

2014. febr. 10. 20:04

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!