PROCEDURE MAIN IS |
|
TYPE PINT IS ACCESS ALL INTEGER; |
--Létrehozunk egy integerre mutató tipust |
P,Q,R : PINT; |
--Deklarálunk három PINT tipusú változót |
I : ALIASED INTEGER |
--Az ALIASED kulcsszóval tudjuk megengedni, hogy a statikus változóra mutató mutasson. --(Ez a dinamikusan lefoglalt változóra nem vonatkozik) |
BEGIN |
|
I := 42; |
|
P := I'ACESS; |
--A P mutatót ráállítjuk az I változóra. Azaz a P mutatónak értékül adjuk az I címét. |
P.ALL := 137; |
--A I változó értékét megváltoztatjuk a P mutatón keresztól. Azaz a P által mutatott memóriaterület értékét megváltoztatjuk |
Q := NEW INTEGER; |
--Dinamikusan lefoglalunk egy INTEGERnyi memóriaterületet, és a címét átadjuk Q-nak |
R := NEW INTEGER'(42); |
--Dinamikusan lefoglalunk egy INTEGERnyi memóriaterületet, adunk neki kezdőértéket, majd a címét átadjuk Q-nak |
END MAIN; |
|
TYPE PKONST_INT IS ACCESS CONSTANT INTEGER; |
|
TYPE PINT IS ACCESS ALL INTEGER; |
|
P : PKONST_INT; |
|
Q : PINT; |
|
I : ALIASED INTEGER; |
|
K : ALIASED CONSTANT INTEGER; |
--Olyan konstans amire lehet mutatót állítani |
KP : CONSTANT PKONTS_INT := K'ACCESS; |
--Kell adni kezdőértéket, mert KP konstans |
KQ : CONSTANT PINT := I'ACCESS; |
--Kell adni kezdőértéket, mert KQ konstans |
helyes műveletek: |
P := K'ACCESS; |
--Mert P egy konstans integerre mutató mutató, a K meg egy konstans integer |
P := I'ACCESS; |
--Egy konstans integerre mutató mutató mutathat nem konstans integerre is, csak a mutatón keresztül nem tudjuk megváltoztatni az I értékét. |
Q := I'ACCESS; |
|
Q.ALL := 29; |
|
P := NEW INTEGER'(2); |
|
KQ.ALL := 1; |
--Mert csak KQ konstans, az általa mutatott terület nem az. |
Hibás műveletek: |
P.ALL := 5; |
--Mert a P konstans integerre mutató, így P-n keresztül nem lehet megváltoztatni a memória értékét |
Q := K'ACCESS; |
--Mert Q nem mutathat konstans integerre |
P := NEW INTEGER; |
--Mert P konstans mutató, és lefoglaláskor nem adtunk kezdőértéket. Később már nem is adhatnánk. |
KP := NEW INTEGER'(100); |
--Mert KP konstans, nem változtathatjuk meg az értékét |
KQ := NEW INTEGER'(100); |
--Mert KP konstans, nem változtathatjuk meg az értékét |
KP.ALL := 10; |
--Mert KP konstansra mutat. |
TYPE TOMB IS ARRAY(1..10) OF INTEGER; |
|
TYPE ALITOMB IS ARRAY(1..10) OF ALIASED INTEGER; |
|
TYPE PINT IS ACCESS ALL INTEGER; |
|
TYPE PTOMB IS ACCESS ALL TOMB; |
|
TYPE PALITOMB IS ACCESS ALL ALITOMB |
|
X : ALIASED TOMB; |
|
Y : ALITOMB; |
|
Z : ALIASED ALITOMB; |
|
PI : PINT; |
|
P : PTOMB; |
|
PA : PALITOMB; |
|
A következő értékadások helyesek: |
P := X'ACCESS; |
--Az X tömb címét értékül adjuk P-nek. Azaz P-t ráállítjuk X-re. |
PI := Y(1)'ACCESS; |
--Jó, mert a PI INTEGERre mutató mutató, a Y tömb elemei pedig ALIASED INTEGEREK |
P := Z'ACCESS; |
|
PI := Z(1)'ACCESS; |
|
A következő értékadások helytelenek: |
I := X(1)'ACCESS; |
--Mert az X tömb elemei nem ALIASED INTEGERek, ezért nem lehet rájuk állítani mutatót |
P := Y'ACCESS; |
--Mert az Y nem ALIASED |
WITH ADA.UNCECKED_DEALLOCATION |
|
PROGRAM MAIN IS |
|
TYPE TOMB IS ARRAY(INTEGER RANGE <>) OF INTEGER; |
--Létrehozunk egy tömb tipust |
TYPE PTOMB IS ACCESS TOMB; |
--Definiálunk egy TOMB-re mutató mutató tipust |
PROCEDURE FREE IS NEW ADA.UNCECKED_DEALLOCATION(TOMB,PTOMB); |
--Példányosítjuk a sablon eljárásunkat. Első paraméter a mutatott objektum tipusa, a második pedig a mutató tipus |
P : PTOMB; |
|
BEGIN |
|
P := new TOMB; |
--Dinamikusan létrehozunk egy tömböt és ráállítjuk P-t |
FREE(P); |
--Felszabadítjuk a P által mutatott területet |
END MAIN; |
|