tablouri dinamice Delfi, diverse articole, articole, programare - programare C,
New Page 1
√ O matrice este un set ordonat de date. De regulă, numărul de elemente din matrice este limitat. mediu Delphi folosind Object Pascal sintaxa limbajului, și în conformitate cu acestea din urmă, matricele sunt declarate astfel:
În cazul în care index1 și indexN aparțin unui tip ordonat, care variază după cum scrie în documentația pentru Delphi 6 este mai mică de 2 Gb. tip BaseType √ elementelor unei matrici.
Am anunțat o matrice My_Array, constând din 100 de elemente de tip Real. Matricele pot fi unidimensional, bidimensional și n-dimensional. În teorie, restricțiile privind dimensiunile matrice nu au, în practică, dimensiunea este limitată de memoria disponibilă.
Toate acest lucru este valabil pentru matrici statice. Cu toate acestea, matrice statice au un dezavantaj semnificativ. În cele mai multe cazuri, nu știm gama noastră va consta din cât de multe elemente. Prin urmare, este necesar să memorie de rezervă „în rezervă“: mai bine o să rezerve mai multă memorie pentru zece elemente ale șirului decât un element de matrice ar fi de prisos. De exemplu, atunci când citirea datelor dintr-un fișier, noi nu știm cât de multe elemente putem citi: una, două, zece sau o sută. În mod obișnuit pentru astfel de sarcini au fost aplicate liste dinamice de LIFO (Last In First Out, un teanc) sau FIFO (First In First Out, lista de așteptare).
dezvoltatorii Delphi în cea mai recentă versiune (5.6) a produsului pus în aplicare mecanism suficient de flexibil pentru matrice dinamice. Noi nu mai trebuie să creați liste dinamice, nu vom uita niciodată pentru a pune un semn „^“ atunci când se referă la un element al listei și pentru o anumită perioadă de timp, uita de noi proceduri, marca și dispune.
Notă. In versiunile anterioare (de exemplu, 3) unui astfel de mecanism nu există.
După cum vedeți, noi spunem pur și simplu Delphi, avem nevoie de o matrice unidimensională de tip real, și de dimensiunea sa, spunem pur și simplu uitate.
După apelarea la această procedură va aloca memorie pentru o serie de 100 de elemente, care vor fi indexate 0-99 (rețineți că indexare este bazată pe zero, mai degrabă decât unul!).
√ matrice dinamice este indicii implicite și sunt deservite de același mecanism care este folosit pentru a manipula șiruri lungi (șiruri lungi). Pentru a elibera memoria ocupată de o matrice dinamică, set variabilă care se referă la o matrice, valoarea nil: A: = zero.
Teoria chimică √ fără practică nu este nimic, prin urmare, pentru o mai bună digestie a materialului, luați î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 executați programul .żn Listing 1 aproape de fiecare rând am valorile variabilelor a și B, după linia trece. După cum puteți vedea, am numărat doar liniile care conțin afirmații care schimbă variabilele A și B.
Linia 1: pentru variabilele A și B de memorie nu este alocat. Concluzia procedurii setlength apel nu poate lucra cu o matrice. În al doilea rând memoria este alocată doar pentru matrice A. Deoarece o variabilă globală √, valorile matrice sunt setate la zero. Dacă variabila A a fost local, este necesar pentru a inițializa elementele de matrice. Variabilele locale nu sunt setate la zero și, de regulă, conține o valoare aleatoare (gunoi), preluate din memorie, în care se află variabila.
În al treilea rând vom atribui matrice matrice A. B nu trebuie să aloce memorie pentru o matrice B cu setlength Înainte de această operație. Atunci când se atribuie elementul B [0] este atribuit A [0] Element, 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. La schimbarea lungimii de matrice A (linia 5), a apărut decalaj datorat între matrice. Acest fenomen arată linia 6, care conține un număr de sarcini. Î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 schimbarea lungimii de matrice este pur și simplu adaugă un element nou, fără nici o pierdere a valorilor pixelilor existente (linia 5). Matricea B lungime asociată rămâne neschimbată.
In linia 7, vom elibera memoria alocată pentru matrice A. Array B rămâne acolo până la sfârșitul programului. Șirurile conțin valoare zero lungime zero.
Este necesar să spun câteva cuvinte despre compararea matrice:
Când încercați o O comparație = B și B = O obținem adevărată: matrice sunt egale. Dar într-o astfel de situație, comparația obținem false:
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). Atunci când se lucrează cu matrice dinamice, nu veți vedea această eroare. Pe de o parte este bine, iar pe de altă √ 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ă mai des decât crezi. Setlength funcția generează o EOutOfMemory eroare, dacă există suficientă memorie pentru alocarea unei matrice.
Nu folosiți operatorul „*“ la variabila unei matrice dinamice. De asemenea, nu trece o matrice variabilă nouă sau va elimina procedura de alocare sau deallocation.
Odată ce o gamă dinamică a fost alocată, puteți transmite o serie de funcții standard de lungime, de înaltă și joasă. 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 de înaltă și joasă, cu cel mai mare beneficiu? Pentru aceasta considerăm procesul de inițializare și suma funcției. Prima dintre aceste inițializează matrice (resetează valorile elementelor), iar al doilea √ calculează suma elementelor șirului: Nu este clar un lucru: Este posibil să se utilizeze o matrice dinamice multi-dimensionale? Da, putem. Declară o matrice bidimensională poate fi după cum urmează: Pentru a aloca memorie necesară pentru a apela o procedură setlength cu doi parametri, de exemplu, Lucrul cu matrice dinamică bidimensională poate fi la fel ca statică: Puteți crea matrice non-dreptunghiulare. Pentru a face acest lucru, mai întâi să declare matrice: Apoi creați n rânduri, dar fără coloanele, de exemplu, Acum puteți crea coloane de diferite lungimi: Notă. Dacă ați lucrat cu versiunile anterioare ale Delphi, probabil știți că funcția setlength este utilizată pentru a modifica dinamic lungimea șirului. Cel mai probabil, nu l-ați folosit, deoarece lungimea șir variat în mod automat în timpul unei misiuni.