B ^ # 91; 3477 # 93; : = FALSE;
FreeMem # 40; B, N * dimensiune # 40; boolean # 41; # 41; ;
FreeMem # 40; B # 41; ;
MaxArraySize = # 40; 65520 div SizeOf # 40; elementType # 41; # 41; ;
(* într-un mediu pe 16 biți *)
MyArrayType = matrice # 91; 1. MaxArraySize # 93; de ElementType;
ArraySizeIWant: Integer = 1500;
Apoi, pentru a aloca memoria pentru o matrice, puteți utiliza următoarea procedură:
dacă ArraySizeIWant <= MaxArraySize then
P: = AllocMem # 40; ArraySizeIWant * SizeOf # 40; LongInt # 41; # 41; ;
Nu uitați că valoarea ArraySizeIWant trebuie să fie mai mică sau egală MaxArraySize.
Iată o procedură care utilizează buclă pentru a seta valoarea fiecărui membru:
pentru I: = 1 până la ArraySizeIWant
Rețineți că trebuie să organizați singur controlul domeniului acceptabil. Dacă aloca memorie pentru o matrice cu cinci elemente, și să încerce să atribuie o valoare a șasea, veți obține o eroare, și, eventual, deteriorarea memoriei.
Rețineți, de asemenea, că după utilizarea matricei, trebuie să fie eliberată toată memoria alocată. Iată un exemplu de cum să scap de această gamă:
P: = AllocMem # 40; ArraySizeIWant * SizeOf # 40; LongInt # 41; # 41; ;
Următorul este un exemplu de matrice dinamică:
SysUtils, WinTypes, WinProcs, Mesaje, Clase, Grafică,
Controale, Formulare, Dialoguri, StdCtrls;
MaxArraySize = # 40; 65520 div SizeOf # 40; elementType # 41; # 41; ;
intervalul maxim pe care probabil aveți nevoie
TDynamicArray = matrice # 91; 1. MaxArraySize # 93; de ElementType;
TForm1 = clasă # 40; TForm # 41;
procedura FormCreate # 40; Expeditor: TObject # 41; ;
procedura Button1Click # 40; Expeditor: TObject # 41; ;
procedura FormDestroy # 40; Expeditor: TObject # 41; ;
sunt variabile statice care sunt inițializate
la momentul executării, valorile specificate în codul sursă.
Acest lucru înseamnă că puteți utiliza tastaturile
constante ca orice alte variabile.
Convenabilitatea este în valoarea inițializată automat
DynamicArraySizeNeeded: Integer = 10;
procedura TForm1. FormCreate # 40; Expeditor: TObject # 41; ;
și alocă mărimea, exact necesară pentru adaptarea matricei noi.
Dacă încercați să scrieți un element care este în afara domeniului,
Compilatorul nu jură, dar aveți un obiect excepțional
P: = AllocMem # 40; DynamicArraySizeNeeded * SizeOf # 40; întreg # 41; # 41; ;
procedura TForm1. Button1Click # 40; Expeditor: TObject # 41; ;
Button1. Subtitrare: = IntToStr # 40; P ^ # 91; 5 # 93; # 41; ;
procedura TForm1. FormDestroy # 40; Expeditor: TObject # 41; ;
FreeMem # 40; P, DynamicArraySizeNeeded * SizeOf # 40; întreg # 41; # 41; ;
Aici „unitate demo“, care prezintă trei moduri diferite (nu toate) pentru a crea matrice dinamice. Toate cele trei metode pentru distribuirea unei cantități suficiente de memorie din heap este utilizat GetMem, tList utilizat pentru a adăuga elemente în listă, și matrice tMemoryStream utilizate pentru a aloca suficienta memorie din heap și accesați-l din fluxul. Bun vechi GetMem potrivit pentru această sarcină, cu condiția ca matrice nu este prea mare (