Dinamička alokacija memorije malo je drugačija u CLR programiranju jer nema operatora delete jer nam nije potreban,CLR ima svoju posebnu „heap“ memoriju kojom automatski upravlja i održava čistom jer ima tkz. "garbage collection“ u koju sprema sve objekte koji se ne koriste više i briše ih , oslobađa memoriju .Tako mi više ne moramo brinuti o tkz. „memory leaks“, curenju memorije ,i garbage collection je koš za otpatke doslovno prevedeno jer sam program prati objekte i kad se više ne koriste jednostavno ih baca u koš i briše(oslobađa memoriju).Sad naravno postavlja se pitanje kao to radi,kako on zna kad je memorija višak i sl.
To radi sličnim postupcima kao i pokazivači u nativnom c++-u ali ima velike razlike ,pokazivači mogu mijenjati adrese i zato smo morali specifično koristiit delete operator ali u C++/CLI programiranju gdje se koristi CLR programiranje ulogu koja je slična pokazivačima ima tkz.tracking handle ili samo handle operator koji nosi oznaku ^ „hat“ iliti šešir koji je oznaka za heap u CLR-u tj. s njim CLR prati sve što se dešava s objektom i naravno kad nije potreban briše ga zahvaljujući tracking handle ^ hat oznaci(operatoru).Nad njime nije moguće vršiti aritmetičke operacije niti castanja.Prije toga moramo izvršiti derefernciranje,eto to je zjaedničko s pokazivačima,to jest pokazivač ali s posebnim ulogama praćenja !To naravno omogućava CLR !!!! Svi objekti koji su članovi klase moraju imati svoj šešir ili hat ili ^ taj znak !!! Naravno imamo u CLR- u i new deklaraciju i naravno zbog automatskog brisanja nemamo delete i zato new ima drugačiji oblik a to je gcnew gdje gc znači koš za otpatke (garbage collection) tako programu dajemo na znanje da smo izvršili alokaciju .Molim ponoviti dinamičku alokaciju u tutu za početnike i polja!Ja sam pojednostavio objašnjenja i vjerujte ako i ovako shvatite o čemu se radi tada ste samo naravno osnove svladali i sad možemo na programe i sve ovo što sam napisao pretvoriti ćemo u programe!
int^rezultat =nullptr;
Znači ovdje smo upotrijebili handle i definirali i deklarirali varijablu rezultat ali nismo je dereferencirali.Zbog toga se program uspješno izvršava i dodjela nullptr je stavljanje varijable na nulu CLR heap memorije.Ako stavimo nulu opet dobro,ali nullptr ne ide s *rezultat(dereferenciranjem) ,*rezultat u tom obliku ide s int^rezultat = 0;
Ako samo napišemo int^rezultat;
tad se neće niti jedan neće program izvršiti jer je potrebno definirati varijablu osim deklaracije jer CLR program sam upravlja s dinamičkom memorijom preko tracking handle ^ !
Probjate sad malo proučavati program koji je gore napisan i uklanjati komentare a stavljati ih tamo gdje treba i u biti sparivati ispise,pokušavajte ,vježbajte i antaj način se i sami učite i duže zadržavate na programu,ja sam ga dovoljno objasnio da bit shvatite,dalje sami sebe učite,tako je dobro za vas.
String^ rezultat = L"Evo sad malo i pisanja recenice tj deklariranja i definiranja!\n\n";
Console::Write("{0}\n",rezultat);
Ovo je zadnji dio koda koji nam pokazuje rad s klasom string ali radi se o wchar_t objektu rezultat koji pripada klasi String.Sve drugo u kodu stavite kao komentare i samo taj kod izvršite i to je to,proučavajte te primjere i vježbajte.
Ovdje u ovom programu prelazimo već na rad s poljima u CLR-u i garbage collector!
Malo proučavajte ovaj program i načine ispisa i deklariranja polja i nova naredba gcnew koja ima ulogu kao i new u native c++ programiranju ali zbog koša za smeće nam ne treba delete naredba jer se u C++/CLI programiranjnu sam program brine za to jer imamo handle metodu praćenja svakog deklariranom i definiranom objektu!Proučite i petlju tj.petlje pomoću kojih čitamo naša polja i u prvom čitanju polja takav je rzultat jer mi u biti radimo s objektima i program nam pokazuje kojem tj.kojoj klasi pripada objekt!U slijedećem programu ću detaljnije objasniti petlje u CLR-u i indeksiranje tj. označavanje objekta da bi ga pročitali pomoću petlje .
Index pomoću kojeg čitamo elemente ili objekte polja nazivamo i iterator ali o tome kasnije.Naravno deklaracija polja u CLR-u ide s ključnom riječi array zatim tip polja između <> tih zagrada ,zatim "hat" ^ i ime našeg polja!!!! To je uobičajena deklaracija u C++/CLI programiranju.Znači u svakom imenovanju objakta moramo primjeniti i označiti s handle hat!!!Još detaljnija objašnjenja slijede ako vam ovo nije bilo jasno.
for (x=0;x
Length
U ovom programu ćemo vidjeti kako iščitavamo polje koje je zadane veličine, a elementi polja se popunjavaju slučajnim odabirom pomoću objekta Random koji je naravno pod handle heap označen i sadrži funkciju koja nam slučajne brojeve određuje unutar raspona 0.0 i 1.0 , i kad to pomnožimo s 100 dobijemo slučajnie brojeve unutar brojke sto tipa double: to radi funkcija NextDoouble(), tu funkciju naravno sadrži Random objekt. Prvo naravno deklariramo i definiramo polje:
array
Random^ sluc_broj = gcnew Random;
for (int x =0;x
primjer[x] = 100.0*sluc_broj->NextDouble();
//izlaz na cmd
Console::WriteLine(L"Polje sadrzi slijedece vrijednosti : ");
for (int x =0;x
{
Console::Write(L"{0,10:F2}",primjer[x]);
if((x+1)%5 == 0).
To pogledajte uvećavajući sliku i u ispisu primjetite kako smo došli do maksimalne vrijednosti u našem ispisu slučajnih brojeva.
Objašnjenje zadnjeg dijela programa slijedi ,mali problemi s blogom.
double max = 0;
for each(double broj in primjer)
if(max < broj)
max = broj;
Console::WriteLine(L"Maksimalna vrijednost u polju je:\n");
Console::Write(L"broj {0:F2}" , max);Console::WriteLine("\n");
Prvo naravno deklaracija i postavljanje na nulu , zatim for each petlja ,uvijet if nam u biti radi našu usporedbu i kad je petlja gotova spremimo broj u max i to ispisujemo ,vidite kako smo napisali ispis,vi ga izmjenite kako vama paše.Za određivanje maksimalne vrijednosti mogli smo upotrijebiti običnu for petlju,vi napravite kako vama paše.
double max = 0;
int pokazatelj = 0;
for(int x = 0;x <> Length;x++)
if(max < primjer[x])
{
max = primjer[x];
pokazatelj = x;
}
Naravno vi ispisujete pokazatelj.Ovo je početak rada s poljima u CLR-u.
Nema komentara:
Objavi komentar