Simularea unei matrice unidimensionale utilizând memorie dinamică
Necesitatea de a folosi instrumente pentru a lucra cu o matrice de memorie dinamică în timp ce procesarea se produce atunci când implementarea statică este ineficientă (de exemplu, dimensiuni matrice variază considerabil în funcție de programul de aplicație și cel mai mare volum posibil de memorie redundanță „în toate ocaziile“ irosit). În acest caz, esența unei „matrice“ a conceptului rămâne același: o colecție de aceleași elemente, care are un singur nume; Elementele sunt aranjate într-o anumită ordine și diferă în indicii; Peste acest set, sunt posibile orice operații permise de tipul elementelor.
Proprietățile listate sunt pur și simplu modelate cu ajutorul memoriei dinamice. Astfel, aspectele legate de implementarea software-ului sunt de interes, care sunt discutate mai jos.
În C, numele unei matrice statice este un pointer constant la primul octet al primului element al matricei. Astfel, descrierea int a [5] poate fi ilustrată după cum urmează:
Astfel, puteți accesa un element de matrice în două moduri, printr-un pointer și indexarea unui element:
Și în acest caz, puteți accesa elementul de câmp în două moduri, printr-un pointer și indexarea elementului:
Memoria se distinge în principiu în moduri diferite, dar este tratată în mod egal. Rețineți că ar fi o greșeală brută să luați în considerare descrierile
Deci, de exemplu, după executarea operatorului
pa = (int *) malloc (10 * dimensionof (int));
Matricea definită mai sus și indicatorul pa devin echivalente în întregime. Cu toate acestea, a doua soluție va fi mai flexibilă, deoarece memoria solicitată este alocată dinamic în timpul executării programului și poate fi returnată sistemului cu ajutorul funcției free () dacă este necesar, ceea ce nu se poate face în cazul unui matrice.
Luați în considerare funcția standard malloc () pentru alocarea dinamică a memoriei pentru stocarea elementelor matrice.
In multe probleme de matematică și de punere în aplicare de calculator a structurilor de informații algoritmi de procesare nevoie apare ca matrice, numărul de elemente de care variază de la o cursă la un alt program.
Cea mai simplă soluție la această problemă este descrierea statică a matriceelor corespunzătoare, indicând numărul maxim de elemente necesare. Cu toate acestea, această abordare duce, de regulă, la o supraestimare nejustificată a cantității de memorie necesară funcționării programului. O soluție alternativă este deschisă în legătură cu utilizarea pointerilor pentru a reprezenta o serie de variabile.
Să presupunem că trebuie să scriem un program de multiplicare scalar pentru vectorii A și B, ale căror dimensiuni nu sunt cunoscute în prealabil. Pentru a face acest lucru, procedați după cum urmează. Descriem titlul variabilei programului m, o lungime care definește tablourile respective și indicii a, b, c, care va defini o locație de memorie și factorii vector vector rezultat:
Odată ce valoarea m este determinată (poate fi introdus, de exemplu, de la o tastatură terminal), este necesar să se aloce suficientă memorie pentru a stoca toate cele trei vectori. Din moment ce vorbim despre matrice sunt alocate în mod dinamic în timpul rulării, trebuie să folosim una dintre cele trei funcții speciale care fac parte din biblioteca standard malloc. h și ale căror detalii sunt prezentate mai jos.
malloc - rezervă un bloc de memorie de octeți de dimensiune de mărime; memoria solicitată este eliberată după terminarea programului sau prin utilizarea funcției libere (vezi mai jos)
Formatul și descrierea argumentelor:
void * malloc (dimensiune)
int dimensiune; / * Numărul necesar de octeți de memorie * /
În exemplul de mai sus, dimensiunea matricei a fost specificată ca 10 * sizeof (int). Aceasta indică faptul că a fost alocat numărul necesar de octeți pentru stocarea a 10 variabile de tipul întreg. Dimensiunea funcției determină numărul de octeți pentru o variabilă a unuia dintre tipurile standard (dimensiunile memoriei pentru stocarea variabilelor pe tipuri sunt date în Tabelul 1).
Pentru funcția malloc, valoarea returnată este un indicator al unui tip nedefinit la primul octet al zonei rezervate a memoriei statice și este NULL dacă nu este posibilă alocarea memoriei de dimensiunea necesară. Pentru a obține un indicator pentru un anumit tip de date, trebuie să aplicați o operație de conversie de tip explicită la valoarea returnată. De exemplu: int * malloc (dimensiune).
Descrierea preliminară a tuturor acestor funcții sunt plasate în stdlib.h și fișierele malloc.h și folosindu-le una dintre ele trebuie să fie incluse în codul sursă al programului folosind #include directivei preprocesor.
După ce am ales în sarcina noastră să alocăm rețelele a, b și c cu funcția m alloc (), putem scrie:
unde operația de turnare (float *) convertește un pointer de tip nedefinit la un pointer float. Acum, după introducerea preliminară a valorilor numerice ale elementelor vectorilor, se poate realiza multiplicarea lor scalară:
pentru (i = 0; i Memoria necesară sistemului prin utilizarea funcției malloc () poate fi returnată la sfârșitul programului utilizând funcția free (). Mai mult, utilizând funcția realloc (), puteți modifica dimensiunea blocului de memorie rezervat anterior. Descrierile preliminare ale funcțiilor free () și realloc () sunt de asemenea găsite în fișierele stdlib () și malloc (), iar informațiile necesare despre ele sunt date mai jos. free - eliberează blocul de memorie rezervat anterior de una dintre funcțiile malloc () sau realloc () Formatul și descrierea argumentelor: void * ptr; / * Pointer la blocul care urmează să fie eliberat * / Această funcție nu aduce nicio valoare ca rezultat al activității sale. În plus, ignoră pointerul ptr dacă este NULL. realloc - modifică dimensiunea blocului de memorie rezervat anterior de funcțiile malloc () sau realloc (). Formatul și descrierea argumentelor: void * realloc (dimensiune ptr.) void * ptr; / * Pointer la anterior * / / * Bloc de memorie rezervat * / int dimensiune; / * Dimensiunea noului bloc în octeți * / Valoarea returnată este un indicator de tip nedefinit la primul octet al zonei rezervate a memoriei statice și este NULL dacă nu este posibilă alocarea memoriei de dimensiunea necesară. În general, aceasta nu este egală cu valoarea indicelui ptr, deoarece schimbarea dimensiunii blocului poate de asemenea să își modifice plasarea în memoria principală a computerului. Pentru a obține un indicator pentru un anumit tip de date, trebuie să aplicați o operație de conversie de tip explicită la valoarea returnată. Acum, știind cum puteți utiliza memoria dinamică pentru a stoca elementele matricei, puteți scrie textul programului în sarcina noastră a produsului scalar al două vectori. De asemenea, este necesar să se ia un exemplu de modificare a dimensiunii unei matrice dinamice unidimensionale în timpul execuției programului. Pentru aceasta, să analizăm problema în care se introduce o secvență de estimări (1-5) și se calculează media aritmetică. Numărul de estimări nu este cunoscut în prealabil, sfârșitul secvenței este 0. # includ Articole similare