Indicatori în delphi, delphi, delphi components, delphi sources

Pointeri în Delphi

Un pointer este doar o variabilă specială. Spre deosebire de variabilele obișnuite care stochează o valoare a unui anumit tip, pointerul stochează adresa celulei de memorie. Numele "pointer" se datorează faptului că indicatorul nu conține o valoare specifică, ci indică celula de memorie în care este stocată valoarea dorită.







În Delphi, există două tipuri de pointeri: tipărite și neotipate (generice). Introduceți indicatorii pot fi utilizați numai cu variabile de un anumit tip, în timp ce indicatorii netratați pot indica orice date.

Indicatori în delphi, delphi, delphi components, delphi sources

Pointerul P poate fi folosit pentru a indica orice locație de memorie care conține o valoare intregă.

Pentru moment, nu încercați să folosiți indicatorul P pentru că nu este inițializat. Când indicatorul nu este inițializat, acesta indică o locație de memorie aleatorie. O încercare de a utiliza un indicator care indică locația greșită a memoriei este ca și cum ați încerca să sari de la o înălțime fără un parașut. Nu poate fi considerat o distracție plăcută.

Acum indicatorul P indică celula de memorie a variabilei I. Dacă doriți să aflați locația exactă a variabilei I în memorie, trebuie să convertiți tipul indicelui la un număr întreg și să îl afișați pe ecran:

Listing 9.1. Folosind un pointer simplu introdus

01. program de proiect1;

Al doilea tip de pointer din Delphi este Pointer. Pointerul este un tip de pointer care poate fi folosit pentru a indica o variabilă a oricărui tip de date. Pentru a lucra cu valoarea indicată de un pointer untip, mai întâi, pointerul untip ar trebui să fie aruncat într-un alt tip de pointer și dereferențiat. Aducerea la un alt tip de pointer nu este deosebit de dificilă, deoarece în Delphi fiecare tip de date are deja un tip corespunzător de pointer. De exemplu, un pointer la o variabilă de tip Char este PChar, un pointer la un șir este PString. un pointer la o variabilă întreg - Pintet și așa mai departe.







Figura 9.2 demonstrează utilizarea tipului Pointer și convertirea lui la alte tipuri de indicatori.

Listarea 9.2. Utilizând un pointer fără titlu

Pentru a rezerva și a lucra cu un bloc de memorie non-standard, trebuie să utilizați procedurile GetMem și FreeMem. Ambele proceduri iau doi parametri: un indicator care trebuie asociat cu un bloc de memorie rezervat și o valoare întregă specificând numărul de octeți de memorie care vor fi rezervați. Când apelați procedura FreeCall, trecerea celui de-al doilea parametru este opțională. În cazul transferului, valoarea transmisă trebuie să corespundă numărului de octeți rezervat de procedura GetCall.

Următorul exemplu demonstrează utilizarea procedurii BlockRead pentru a citi întregul fișier într-un bloc de memorie alocat dinamic (rezultatul este prezentat în Figura 9.1).

Listing 9.3. Încărcarea unui fișier într-un bloc de memorie alocat dinamic

01. program de proiect1;
02.
03. utilizări
04. SysUtils;
05. procedura ReadFile (var P: Pointer; const AFileName: șir);
06. var
07. Src: dosar;
08. BytesRead: Integer;
09. BufferPos: Pointer;
10. începe
11. Atribuiți fișierul (Src, AFileName);
12. <$I ->
13. Resetare (Src, 1);
14. <$I +>
15. dacă IOResult = 0 atunci
16. începe
17. dacă P <> nul apoi FreeMem (P);
18. GetMem (P, FileSize (Src));
19. BytesRead: = - 1;
20. BufferPos: = P;
21. în timp ce BytesRead <> 0 face
22. începe
23. BlockRead (Src, BufferPos ^, 1024. BytesRead);
24. Inc (Integer (BufferPos), BytesRead);
25. sfârșitul;
26. CloseFile (Src);
27. sfârșitul; // dacă IOResult
28. sfârșitul;
29. Procedura RemoveFile (var P: Pointer);
30. începe
31. FreeMem (P);
32. P: = nul;
33. sfârșit;
34. var
35. FilePtr: Pointer;
36. începe
37. ReadFile (FilePtr, 'c: \ data.txt');
38. WriteLn (șir (FilePtr));
39. RemoveFile (FilePtr);
40. ReadLn; end.

Codul de descărcare a fișierului este definit în procedura ReadFile. Înainte de a relua un nou bloc de memorie, procedura trebuie să determine dacă indicatorul a trecut, deoarece parametrul P indică un bloc de memorie. Dacă da, trebuie să eliberați vechiul bloc de memorie. În caz contrar, va exista o scurgere gravă de memorie.

Procedura GetMem utilizează funcția FileSize pentru a determina cantitatea exactă de memorie (în octeți) necesară pentru a stoca întregul fișier. După ce memoria este rezervată, procedura începe să citească fișierul în memorie.

Fig. 9.1. Aduceți tipul de date al blocului de memorie la un șir

Probabil cea mai neobișnuită parte a procedurii este pointerul Buf ferPos local. Înainte de a începe să citiți fișierul într-o buclă în timp, procedura atribuie un indicator pointerului Bu f fer Pos:

Blochează (Src, BufferPos, 1024. BytesRead);

După ce procedura BlockRead stochează 1024 octeți în blocul de memorie, este necesar să actualizați indicatorul BufferPos. Dacă acest lucru nu este realizat, rutina BlockRead va citi întregul fișier, dar va suprascrie cele mai vechi date cu ultimii 1024 octeți din fișier.

Pentru a afișa întregul fișier text, este suficient să convertiți tipul de date al blocului de memorie într-un șir:

WriteLn (șir (FilePtr));

Numere: matrice [1..20] de Integer; PI. PInteger;







Trimiteți-le prietenilor: