Mutatók delphi, delphi, delphi komponensekben, delphi forrásokban

Mutatók Delphiban

A mutató csak egy speciális változó. A rendes változókkal ellentétben, amelyek egy bizonyos típusú értéket tárolnak, a mutató tárolja a memóriakártya címét. A "mutató" neve annak a ténynek köszönhető, hogy a mutató nem tartalmaz konkrét értéket, hanem arra a memóriasejtre mutat, amelyben a kívánt érték tárolódik.

A Delphi-ban kétféle mutató található: gépelt és nem típusos (generikus). A beírt mutatók csak egy adott típusú változókkal használhatóak, míg a nem karakterelt mutatók bármely adatra mutathatnak.

Mutatók delphi, delphi, delphi komponensekben, delphi forrásokban

A P mutató használható bármely olyan memóriahelyre, amely egész számot tartalmaz.

Most ne próbálja meg használni a P mutatót, mert nem inicializálva. Ha a mutatót nem inicializálták, egy véletlenszerű memóriahelyre mutat. A helytelen memóriahelyre mutató mutató használata olyan, mintha egy ejtőernyő nélküli magasságból próbálna ugrani. Alig lehet kellemes időtöltésnek tekinteni.

Most a mutató P pont a memória helyét a változó I. Ha azt szeretnénk, hogy megtudja, pontosan hol azt a memóriában egy változó, akkor kell átalakítani áfa mutató típus integer szám, és megjeleníti azt a képernyőn:

Lista 9.1. Egy egyszerű gépelt mutató segítségével

01. program Projekt1;

A Delphi második mutatója Pointer. A pointer egy nem tipizált mutató típusa, amely bármilyen típusú adatváltozóra mutat. Együttműködik az érték, amelynél a dekrétumok Vaeth netipizirovannil-mutatót, kezdetben típustalan pointer kell hozni egy mutató típusú és végrehajtani dereference. Egy másik típusú mutató létrehozása nem különösebben nehéz, mivel a Delphi-ban minden adattípusnak van egy megfelelő mutatója. Például egy Char karakter változóhoz mutató mutató PChar, egy mutató egy stringhez PString. egy mutató egész változóra - PInteger és így tovább.

A 9.2-es lista bemutatja a mutató típusának használatát és átalakítását más típusú mutatókra.

Lista 9.2. Nem titkos mutató használatával

Ha nem szabványos memóriakártyát szeretne tárolni és dolgozni, akkor a GetMem és a FreeMem eljárásokat kell használnia. Mindkét eljárást, hogy két para-méteres mutatót, amely kell társítani fenntartott memóriával blokk és egy egész számának megadásával fenntartott bájt memória. Amikor felhívja a FreeCall eljárást, a második paraméter átadása opcionális. Átvitel esetén a továbbított értéknek meg kell felelnie a GetCall eljárás által fenntartott bájtok számának.

A következő példa bemutatja a használatát BlockRead eljárás olvasni a teljes fájl memóriába dinamikusan fenntartva blokk (tat az eredményeket ábrán látható. 9.1).

Lista 9.3. Fájl betöltése dinamikusan elosztott memóriablokkba

01. program Projekt1;
02.
03. felhasználás
04. SysUtils;
05. eljárás ReadFile (var P: mutató; const AFileName: string);
06. var
07. Src: file;
08. BytesRead: Integer;
09. BufferPos: Pointer;
10. kezdődik
11. AssignFile (Src, AFileName);
12. <$I ->
13. Reset (Src, 1);
14. <$I +>
15. ha IOResult = 0 akkor
16. kezdődik
17. ha P <> null, majd FreeMem (P);
18. GetMem (P, FileSize (Src));
19. BytesRead: = - 1;
20. PufferPos: = P;
21. míg BytesRead <> 0 do
22. kezdődik
BlockRead (Src, BufferPos ^, 1024. BytesRead);
24. Inc (Integer (BufferPos), BytesRead);
25. vég;
26. CloseFile (Src);
27. vég; // ha IOResult
28. vég;
29. eljárás RemoveFile (var P: Pointer);
30. kezdődik
31. FreeMem (P);
32. P: = null;
33. vég;
34. var
35. FilePtr: Pointer;
36. kezdődik
37. ReadFile (FilePtr, 'c: \ data.txt');
38. WriteLn (string (FilePtr));
39. RemoveFile (FilePtr);
40. ReadLn; végén.

A fájl letöltési kódját a ReadFile eljárás határozza meg. Új memóriablokk folytatása előtt az eljárásnak meg kell határoznia, hogy a mutató P paraméterként átadott-e egy memóriablokkot. Ha igen, fel kell szabadítania a régi memóriablokkot. Ellenkező esetben súlyos szivárgás tapasztalható a memóriában.

A GetMem eljárás a FileSize funkció használatával meghatározza a teljes fájl tárolásához szükséges memória pontos mennyiségét (bájtban). A memória lefoglalása után az eljárás megkezdi a fájl memóriába való olvasását.

Ábra. 9.1. Húzza a memóriakártya adattípusát egy karakterláncba

Valószínűleg az eljárás legszokatlanabb része a helyi Buf ferPos mutató. Mielőtt elkezdi olvasni a fájlt egy idő hurokban, az eljárás hozzárendel egy mutatót a mutatóhoz Bu f fer Pos:

BlockRead (Src, BufferPos, 1024. BytesRead);

Miután a BlockRead eljárás 1024 bájtot tárol a memóriában, frissíteni kell a BufferPos mutatót. Ha ez nem történik meg, a BlockRead rutin elolvassa a teljes fájlt, de felülírja a legrégebbi adatokat az utolsó 1024 bájtból a fájlból.

A teljes szövegfájl megjelenítéséhez elegendő a memóriablokk adattípusának formátumba konvertálása:

WriteLn (string (FilePtr));

Számok: tömb [1..20] Integer; PI. PInteger;