Seturi dinamice în Delphi, diferite articole, articole, programare - programare c,

Noua pagină 1

O matrice este un set de date ordonat. Ca regulă, numărul elementelor din matrice este limitat. Mediul Delphi folosește sintaxa limbajului Object Pascal și, conform ultimului, matricele sunt declarate astfel:







Unde index1 și indexN aparțin unui tip ordonat, intervalul căruia, așa cum este scris în documentația pentru Delphi 6, nu depășește 2Gb. BaseType √ tipul elementelor de matrice.

Am declarat matricea My_Array, compusă din 100 de elemente de tip Real. Arrays pot fi unidimensionale, bidimensionale și n-dimensionale. Teoretic, nu există nici o restricție asupra dimensiunii matricei, în practică, dimensiunea este limitată de memoria disponibilă.

Toate acestea sunt valabile pentru matricele statice. Cu toate acestea, matricele statice au un dezavantaj semnificativ. În cele mai multe cazuri, nu știm câte elemente va cuprinde matricea noastră. Prin urmare, trebuie să rezervăm memoria "în rezervă": Mai bine am rezervat memoria pentru încă zece elemente ale matricei decât un element al matricei va fi superfluă. De exemplu, când citim informații dintr-un fișier, nu știm câte articole putem citi: una, două, zece sau o sută. De obicei, au fost folosite liste dinamice LIFO (Last In First Out, stack) sau FIFO (First In First Out, turn) pentru a rezolva astfel de probleme.

Dezvoltatorii Delphi, în cele mai recente versiuni (5,6) ale produsului său, au implementat un mecanism destul de flexibil pentru lucrul cu matrice dinamice. Nu mai trebuie să creați liste dinamice, nu vom uita niciodată să plasăm caracterul "^" atunci când accesăm articolul din listă și pentru o vreme vom uita de procedurile noi, marcaje și dispuneri.

Notă. În versiunile anterioare (de exemplu, 3), un astfel de mecanism nu exista.

După cum puteți vedea, îi spunem lui Delphi că avem nevoie de o gamă unidimensională de tip Real și pur și simplu am uitat de dimensiunea sa.

După apelarea acestei proceduri, va fi alocată memoria pentru 100 de elemente ale matricei, care va fi indexată de la 0 la 99 (nota: indexarea începe de la zero și nu de la unul!).

Matricele dinamice sunt indicatori impliciți și sunt deservite de același mecanism care este folosit pentru procesarea șirurilor lungi. Pentru a elibera memoria ocupată de matricea dinamică, atribuiți valoarea zero: A: = zero la variabila care face referință la matrice.

O teorie uscată fără practică nu este nimic, deci pentru cea mai bună digestie a materialului, ia în considerare următorul program:

Apoi, deschideți fereastra Listă Watch apăsând combinația de taste Ctrl + Alt + W și setați rămâne pe fereastra modul Top (Echipa rămâne pe sus va apărea în meniul pop-up atunci când faceți clic dreapta oriunde în fereastra) la fereastra din vedere când rulați programul. În lista 1, lângă fiecare linie, am specificat valorile variabilelor A și B după trecerea liniei. După cum ați observat, am numerotat numai liniile care conțin operatori care modifică variabilele A și B.







Linia 1: pentru variabilele A și B nu este alocată nicio memorie. Prin urmare, concluzia: înainte de a apela procedura SetLength este imposibil să lucrați cu matricea. În al doilea rând, memoria este alocată numai matricei A. Deoarece variabila A este globală, valorile elementelor matrice sunt resetate la zero. Dacă variabila A era locală, trebuie să inițializăm elementele matricei. Variabilele locale nu sunt zero și, de regulă, conțin valori aleatorii (gunoi) luate din memoria în care se află variabila.

În a treia linie, atribuim matricea A. Nu avem nevoie să alocăm memoria pentru matricea B cu SetLength înainte de această operație. Se atribuie unui element B [0] un element A [0], B [1] √ A [1] etc. Să acorde o atenție la linia 4: noi valori noi matrice A și în mod automat (matrici √ aceleași indicatori) elemente de matrice B pentru a atribui aceleași valori exacte, și invers: ar trebui să ne schimbăm orice element din matrice B, schimbați elementul șirului A cu indicele corespunzător .

Acum începe distracția. Când se modifică lungimea matricei A (linia 5), ​​comunicarea dintre matrice a fost întreruptă. Acest fenomen este demonstrat de linia 6, care conține o serie de operatori de atribuire. În primul rând, vom atribui valorile elementelor de matrice A: 2, 4, 5. Apoi, încercați să schimbați valoarea elementului A [0], atribuind elementul B [0] la 1. Dar, după cum am văzut, comunicarea dintre tablouri nu există și după modificarea valorii elementului B [0], valoarea elementului A [0] nu a fost modificată. Un alt punct important: atunci când se modifică lungimea matricei, se adaugă pur și simplu un element nou, fără a se pierde valorile deja existente ale elementelor (linia 5). Lungimea matricei asociate B nu se modifică.

În linia 7, eliberăm memoria alocată pentru matricea A. Arrayul B rămâne în vigoare până la sfârșitul programului. Matricele cu lungime zero conțin valoarea zero.

Trebuie să spun câteva cuvinte despre compararea matricelor:

Când încercăm să comparăm A = B sau B = A, ajungem la adevărat: matricele sunt egale. Dar, în această situație, când comparăm, ajungem falsi:

Când încercați să atribuiți o valoare unui element de tablou static al cărui indice este în afara limitelor matrice, vom obține eroarea corespunzătoare: expresie constantă încalcă limitele subrange (limitele domeniului încălcare). Când lucrați cu matrice dinamice, nu veți vedea o eroare similară. Pe de o parte, e bine, dar pe de altă parte e rău. Puteți petrece o mulțime de timp să dau seama de ce nu se poate atribui o valoare unui element de matrice cu indicele 4, până când găsiți că la începutul programului, să aloce doar trei elemente. Acum, această situație pare ridicolă, dar se întâmplă mult mai des decât credeți. Funcția SetLength generează o eroare EOutOfMemory dacă nu există suficientă memorie pentru alocarea matricei.

Nu utilizați operatorul "^" pe variabila din matricea dinamică. De asemenea, nu trebuie să treci o variabilă de array la procedurile Noi sau Dispose pentru alocarea sau eliberarea memoriei.

Odată ce matricea dinamică a fost alocată, puteți transfera matricea la funcțiile standard Lungime, Ridică și Scăzut. Lungimea returnează numărul de elemente din matrice, înaltă returnează matrice de cel mai mare indice (adică, Lungime √ 1), se întoarce scăzute 0. În cazul unui șir de lungime zero, există o situație paradoxală: randamente mari -1 și scăzut √ 0, se pare că de mare

Cum putem folosi funcțiile High și Low cu cel mai mare beneficiu? Pentru aceasta, luați în considerare procedura inițială și funcția sumă. Prima dintre ele inițializează matricea (zeroază valorile elementelor), iar a doua √ numără suma elementelor de matrice:

Un lucru rămâne neclar: pot fi utilizate rețelele dinamice multidimensionale? Da, putem. Puteți declara o matrice bidimensională astfel:

Pentru a aloca memorie, trebuie să apelați procedura SetLength cu doi parametri, de exemplu,

Lucrul cu o matrice dinamică bidimensională poate fi același ca și cu unul static:

Puteți crea cadre non-dreptunghiulare. Pentru aceasta, mai întâi declarați o matrice:

Apoi creați n rânduri, dar fără coloane, de exemplu,

Acum puteți crea coloane de lungimi diferite:

Notă. Dacă ați lucrat cu versiuni anterioare ale Delphi, probabil știți că funcția SetLength a fost utilizată pentru a modifica dinamic lungimea șirului. Cel mai probabil, nu l-ați folosit, deoarece lungimea liniei a fost modificată automat în timpul operației de atribuire.







Articole similare

Trimiteți-le prietenilor: