utorak, 26. veljače 2008.

CLR dinamička alokacija,polja,osnove!

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;xLength;x++)

Length
je ključna riječ u CLR-u i označava duljinu a operator -> je operator pristupa ili slično pokazivaču ali da bi ga primjenili u programu taj operator mora biti član neke klase ili objekta koji sadrži elemente na koje može pokazivati.Mi smo taj operator primjenili umjesto x<=3; ,a Lenght nam je dužina polja.Znači taj operator uglavnom primjenjujemo kad radimo s nečim što sadrži članove ili elemente,u našem slučaju polja.To je isto kao da smo u nativnom programiranju pokazali na neki element pomoću pokazivača koji nam pokazuje na taj element .Kasnije u daljnnjem tijeku ove stranice biti će više o tome.Normalno da će se veliki programeri ljutiti na ovakva moja objašnjenja ali nigdje nisam našao takva objašnjenja bez velikih filozofiranja i matematičkih formula jer valjda u tome uživaju oni koji na taj način žele nešto nekome približiti misleći da je to jednostavno i omalažavajući druge jer ,eto oni su veliki programeri koji pišu li ga pišu i na kraju se izgube u svemu tome ..možda se i ja izgubim ali to mi nije namjera kao ni da previše kompliciram.Ako "veliki umovi" i misle da je ovo besmislica ,neka sami pišu jednostavne knjige ali vjerujte neće ,jer treba normalnim ljudima uzeti što više novaca za knjige.Pišem ove tutorijale ponukan nekim osobama koje uglavnom uče iz javnog pristupa internetu i onima koji to žele naučiti i nadam se da mi ljudi dobre volje ne zamjeraju jer mi je već dosta kritika tkz."intelektualaca" a od normalnih ljudi, i ljudi koji nisu puni sebe primam zahvale ,a vjerujte da mi to više znači od svega.Eto mala digresija.Nastavljamo. CLR polja
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^ primjer = gcnew array(50);

…zatim kad smo odredili veličinu polja odredimo i slučajne brojeve:

Random^ sluc_broj = gcnew Random;
for (int x =0;xLength ;x++)
primjer[x] = 100.0*sluc_broj->NextDouble();
//izlaz na cmd
Console::WriteLine(L"Polje sadrzi slijedece vrijednosti : ");
for (int x =0;xLength;x++)
{
Console::Write(L"{0,10:F2}",primjer[x]);
if((x+1)%5 == 0).

...naravno s već spomenutom funkcijom NextDouble() i u petlji smo upotrijebili -> Length kao dužinu našeg polja i rarspon slučajnih brojeva naravno unutar 100.0 . Sad ispis je malo dugačiji jer smo unutar for petlje naredili računalu da nam deset linija razmaka radi ,i u if uvjetu svaki peti se ispisuje zbog %5 izraza naravno i tako editiramo naš ispis na ekranu u pet redova .Mijenjajte malo vrijednosti ,igrajte se i shvatite logiku, naravno ponovite slučajne brojeve iz tuta za početnike i usvojite nove naredbe iz CLR-a i tako polako C++/CLI programiranje ne mora biti teško. Zaboravih napomenuti da smo zbog F2 namjestili da nam se double vrijednosti ispisuju na dvije decimale.Ponovite sve dosad također o CLR programiranju i ispis bi vam trebao biti jasan. Sad,nam ostaje još zadnji dio koji nam ispisuje maksimalnu vrijednost unutar našeg polja.

To pogledajte uvećavajući sliku i u ispisu primjetite kako smo došli do maksimalne vrijednosti u našem ispisu slučajnih brojeva.







O
bjaš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: