Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 10.1.2012, 18:06   #1
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Question Dinamička alokacija memorije...

Skoro sam krenuo da se interesujem za ovo posto C ne podrzava nizove sa promenljivom duzinom ali mi nesto nije jasno.
Ako sam dobro skapirao, malloc(size); rezervise size bajtova u memoriji i vraca pokazivac na taj rezervisani blok memorije. Ali kad ja rezervisem npr. size bajtova i nakon toga u taj niz unesem size + x (x > 0) necega (recimo karaktera, posto su oni po 1 bajt), kompajler se ne buni, program ne kresuje, sve je u redu iako sam ocigledno probio velicinu niza (koji je veliine size, a ja uneo vise od size clanova). Help!
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 10.1.2012, 18:22   #2
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Citat:
...C ne podrzava nizove sa promenljivom duzinom.
realloc

To ostaje na tebi da vodis racuna da ne pises/citas van granica niza! U ovom slucaju program moze, ali i ne mora da kresuje. Ovo obicno zovu "tempirana bomba".
Belphegor je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci:
ozzytheking (10.1.2012)
Stara 10.1.2012, 18:28   #3
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Aha. OK. Pod promenljivom duzinom sam mislio "unosenje velicine niza nakon sto se program pokrene" ali me mrzelo da pisem.
Jos nesto, onda bi za npr. niz short-ova pisao: malloc(sizeof(short)*koliko_shortova);?
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 10.1.2012, 18:33   #4
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Citat:
Jos nesto, onda bi za npr. niz short-ova pisao: malloc(sizeof(short)*koliko_shortova);?
Da.

5char
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 10.1.2012, 20:49   #5
Kosinus
Član
 
Član od: 3.11.2009.
Lokacija: root_localhost
Poruke: 132
Zahvalnice: 16
Zahvaljeno 20 puta na 12 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Ili calloc( koliko_shortova, sizeof( short ) ); sto je potpuno isto.
Kosinus je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Kosinus na korisnoj poruci:
ozzytheking (10.1.2012)
Stara 10.1.2012, 22:43   #6
EclipsE
Starosedelac
 
Član od: 16.4.2006.
Lokacija: Scary Movie Reputacija: ■■□
Poruke: 1.337
Zahvalnice: 378
Zahvaljeno 279 puta na 196 poruka
Slanje poruke preko Skypea korisniku EclipsE
Određen forumom Re: Dinamicka alokacija memorije...

calloc popuni alociranu memoriju nulama, dok malloc ne radi to.
EclipsE je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku EclipsE na korisnoj poruci:
ozzytheking (10.1.2012)
Stara 10.1.2012, 23:07   #7
Kosinus
Član
 
Član od: 3.11.2009.
Lokacija: root_localhost
Poruke: 132
Zahvalnice: 16
Zahvaljeno 20 puta na 12 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Da, tim bolje jer ne mora da poziva memset ako mu zatreba da su lokacije napunjene nulama na pocetku.
Kosinus je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Kosinus na korisnoj poruci:
ozzytheking (11.1.2012)
Stara 10.1.2012, 23:12   #8
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Ipak ne treba koristiti calloc osim ako baš nije potrebno da imaš "čist" alociran prostor, čisto da se ne gubi na performansama.
voodoo_ je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci:
ozzytheking (11.1.2012)
Stara 11.1.2012, 19:49   #9
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Nesto mi nije jasno, kada napisem malloc(sizeof(unsigned short)*blabla) i kasnije krenem da popunjavam taj prostor brojevima, program mi kresuje (sto je OK). I onda provalim da se problem resava tako sto napisem
malloc(sizeof(unsigned short *)*blabla). Ali, mi nije jasno zasto tako treba.
Provalio sam da je velicina (sizeof) pokazivaca uvek 4 bez obzira na sta on pokazuje sto je 99% uzrok kresovanja programa (jer je velicina short-a 2). Ali zar memorija alocirana sa malloc() ne treba da pamti promenljive tipa short, a ne (short *)?
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 11.1.2012, 20:31   #10
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Daj odlomak programa da ti kažemo gde grešiš

Inače veličina pokazivača je 4 bajta (32-bita) ako kompajliraš 32-bitni program. Ako praviš 64-bitni EXE, sizeof(pokazivač) biće 8 bajtova.

E sad, tvoj problem može biti to što si napravio niz dvobajtnih short-ova, a onda po njemu kreneš da pišeš u stilu

a[0] = 5

('a' je ono što si dobio s malloc-om)
s tim što će kompajler peticu tretirati kao običan 4-bajtni int, tako da probaj sa kastovanjem, npr

a[0] = (unsigned short) 5

A ovo malloc(sizeof(unsigned short *)*blabla) uopšte ne treba da radiš jer ti cilj svakako nije pravljenje niza pokazivača nego niza običnih celobrojnih vrednosti.
voodoo_ je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci:
ozzytheking (11.1.2012)
Stara 11.1.2012, 21:07   #11
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Ni meni ne izgleda normalno da pravim niz pokazivaca, ali tako je jedino program radio normalno. Probao sam sa kastovanjem i isto se desava. Sve promenljive su tipa unsigned short.
Kod:
unsigned short *queue, queue_start_pointer, queue_end_pointer;
//pretpostavljam da ovo moze (da ne moraju posebno pokazivaci a posebno promenljive)

void nekametoda()
{
    ...
    free(queue);
    queue = malloc(sizeof(unsigned short)*red_max*kol_max);
    ...
    <while petlja koja puni/prazni queue uz pomoc enqueue() i dequeue() metoda>
    //program kresuje kad se queue "napuni" na nekih 70%
    //u vecini primera queue se ne napuni mnogo pa program radi normalno
}

void enqueue(unsigned short red, unsigned short kol)
{
    queue[queue_end_pointer*2 + 0] = (unsigned short)red;
    queue[queue_end_pointer*2 + 1] = (unsigned short)kol;
    queue_end_pointer++;
}

void dequeue()
{
    r = queue[queue_start_pointer*2 + 0];
    k = queue[queue_start_pointer*2 + 1];
    queue_start_pointer++;
}

Poslednja ispravka: ozzytheking (12.1.2012 u 1:20)
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 11.1.2012, 21:44   #12
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Ako si zamislio da ti queue_start_pointer i queue_end_pointer takođe budu pokazivači, onda ti ne valja deklaracija, treba

unsigned short *queue, *queue_start_pointer, *queue_end_pointer;

A ako je ova dvojka u *2 veličina short-a, nemoj raditi takvo hardkodovanje nego uvek koristi sizeof.

Nešto sam sav šlogiran od umora pa ne mogu detaljno da analiziram program, samo mi je ovo prvo upalo u oči
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 11.1.2012, 21:57   #13
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Zamislio sam ovako kako jeste (pokazivac, broj, broj) ali nisam bio siguran da valja. Mada, sad si odgovorio na to pitanje.
Dvojka nije velicina short-a nego broj kolona u "matrici" (posto ne znam kako da napravim matricu od dvostrukih pokazivaca - **, ili kako se vec zovu, napravio sam da se matrica cuva u nizu). Nulta kolona sluzi za cuvanje redova, a prva za kolone. To je u stvari matrica sa (red_max*kol_max) redova i 2 kolone. queue[queue_start_pointer*2 + 0] bi u stvari bilo queue[queue_start_pointer][0], a queue[queue_start_pointer*2 + 1], queue[queue_start_pointer][1]...
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 12.1.2012, 0:03   #14
EclipsE
Starosedelac
 
Član od: 16.4.2006.
Lokacija: Scary Movie Reputacija: ■■□
Poruke: 1.337
Zahvalnice: 378
Zahvaljeno 279 puta na 196 poruka
Slanje poruke preko Skypea korisniku EclipsE
Određen forumom Re: Dinamicka alokacija memorije...

Dinamička matrica:

Kod:
typedef unsigned short ushort; // lakse mi da pisem ushort

....
int i;
ushort **matrix = malloc(sizeof(ushort*) * VRSTA);

for (i = 0; i < VRSTA; i++)
    matrix[i] = malloc(sizeof(ushort) * KOLONA);

....

// kada brises:
for (i = 0; i < VRSTA; i++)
    free(matrix[i]);

free matrix;
Napraviš niz nizova
EclipsE je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku EclipsE na korisnoj poruci:
ozzytheking (12.1.2012)
Stara 12.1.2012, 1:55   #15
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom Re: Dinamicka alokacija memorije...

OMG! Kako sam glup! Provalio sam zasto ne radi. Niz queue treba da ima red_max*kol_max redova i 2 kolone, ali posto nisam znao kako da napravim matricu pomocu pokazivaca (hvala EclipsE, probacu), strpao sam sve u jedan niz ali njegova duzina je trebala da bude red_max*kol_max*2, a ne red_max*kol_max.
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 13.1.2012, 13:48   #16
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: Dinamicka alokacija memorije...

Ne moraš uopšte tako dinamički da alociraš matricu, ništa ne smeta da jednostavno napraviš jednodimenzionalan niz i koristiš ga kao matricu (u stvari, matrica u suštini i jeste jednodimenzionalan niz, pošto je memorija linearna )
Geomaster je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Geomaster na korisnoj poruci:
ozzytheking (19.1.2012)
Stara 19.1.2012, 18:59   #17
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom Re: Dinamicka alokacija memorije...

Imam 2 pitanja.
1. Vidim da funkcija malloc() ne postavlja alocirani deo memorije na nula, vec su tu neki nasumicni brojevi, pa se setih i da neinicijalizovana promenljiva takodje ima neku nasumicnu vrednost. E sad, odakle ta nasumicna vrednost? Zar prazni deo memorije ne bi trebalo da bude uvek niz nula?

2. Zar velicina boolean promenljive nije 1 bit? Zasto sizeof(_Bool) vraca 1 (pretpostavljam da vraca broj bajtova, a ne bita)?
_Bool *p = malloc(5*sizeof(_Bool));
Sta se ovde desilo? malloc() alocira odredjeni broj bajtova. _Bool je 1 bit. Sta se desi kada hocu da (m)alociram niz bool promenljivih? Hoce li malloc da alocira (u ovom primeru) 5 bajtova i pritom da onih preostalih 7 bita po elementu niza (7*5 = 35) bleji neiskorisceno?
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 19.1.2012, 19:20   #18
NISAM NESTO SMART
Član
 
Član od: 14.7.2009.
Lokacija: Srbija
Poruke: 315
Zahvalnice: 53
Zahvaljeno 73 puta na 54 poruka
Slanje poruke preko MSN-a korisniku NISAM NESTO SMART
Određen forumom Re: Dinamicka alokacija memorije...

Nisam siguran za odg. ni na 1 ni 2 pitanje tako da ako sam se pr*sro izvinjavam se

1.Mozda zato sto kad se deo memorije oslobodi ta memorija se zapravo ne izbrise vec se samo naznaci da je slobodna i da moze da se prepise, pa kad alociras memorji ona ima vrednost prethodnog podatka koji je bio tamo.

2.Da velicina bool promenjive je 1 bajt a ne bit, to je i mene zanimalo, koliko sam razumeo ima veze sa nacinom s kojim kompjuter pristupa memoriji tako da najmanje mozes da rezervises jedan bajt. Tako da je zapravo bool promenjivoj samo 1 bit potreban ali mora biti velicine 1 bajta.
NISAM NESTO SMART je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku NISAM NESTO SMART na korisnoj poruci:
ozzytheking (19.1.2012)
Stara 19.1.2012, 19:21   #19
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Dinamicka alokacija memorije...

1. Memoriju mozes da zamislis ovako:



i recimo na adresi 1 je bila neka promenljiva sa nekom vrednosti. Kad prestane da postoji, vrednost te promenljive ostaje zapisan na toj adresi, pa moze da se desi da taj program dodeli taj (sad slobodan) prostor preko malloc-a recimo.
Mislim, bar tako ja kapiram kako to izgleda.

edit:
Kod:
#include <iostream>
#include <limits>

int main()
{
    long adresa = 0;

    {
        int var = 345;
        std::cout << "adresa promenjive var je " << &var << std::endl;
        std::cout << "vrednost promenjive var je " << var << std::endl;
        adresa = (long)&var;
    }

    std::cout << "-------------------------------------------------" << std::endl;

    {
        int* var2 = (int*)adresa;
        std::cout << "adresa gde pokazivac var2 pokazuje je " << var2 << std::endl;
        std::cout << "adresa pokazivaca var2 je " << &var2 << std::endl;
        std::cout << "vrednost na adresi gde je nekad postojala var prom. je " << *var2 << std::endl;
    }

    std::cout << "Press enter to exit...";
    std::cin.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
    return 0;
}
2. Ne mozes da alociras manje od 1 bajta. Mada mozes sam da kreiras alokator bool-ova koji se tako ponasa.

edit: NISAM NESTO SMART super-ninja

Poslednja ispravka: Belphegor (19.1.2012 u 19:40)
Belphegor je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci:
ozzytheking (19.1.2012)
Stara 14.3.2012, 23:35   #20
NISAM NESTO SMART
Član
 
Član od: 14.7.2009.
Lokacija: Srbija
Poruke: 315
Zahvalnice: 53
Zahvaljeno 73 puta na 54 poruka
Slanje poruke preko MSN-a korisniku NISAM NESTO SMART
Određen forumom Re: Dinamička alokacija memorije...

Što se tice ovog skladistenja boolean vrednosti u jedan bit memorije, sad tek provalio da u C++ postoji bit fields(mozda je to opste poznato ali za mene je novost). Iako vidim da nije pametno koristiti zbog lose portabilnosti preko operativnih sistema valjda zbog big i little endian nacina sistema i razlike izmedju njih, ali vidim po netu da ima neke primene za low-level stuff i u networkingu.

Otprilike ovako mozes da se koristi za skladistenje vise bolean vrednosti u jedan bajt:

Kod:
struct BitField
{
  bool red : 1;
  bool blue : 1;
  bool white : 1;
  //..itd 
};

int main()
{
  BitField color;
  color.blue = 1;
  if(color.blue)
   //is't blue do something

  return 0;
}
I ne moramo samo 1 bit da koristimo u slucaju bolean vrednosti samo 1 bit nam treba ali slobodno mozemo uzeti vise bitova.
Vise o ovome ovde.
NISAM NESTO SMART je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Tagovi
malloc


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
DDR3 memorije različitih brzina i latencija ivanza ŠDK - Osnovne komponente 3 25.2.2017 3:45
Chrome i problem sa zauzećem memorije Wizard Aplikativni softver 0 12.2.2010 20:35
Asus P5Q Pro kompatibilne i nekompatibilne memorije ivanza Osnovne komponente 4 13.12.2008 16:43
Toshiba A100 ne vidi 1GB memorije Marti Misterija Prenosni računari 9 4.9.2008 21:05
Overclock DDR memorije! sasha vukelic Overklok 13 28.12.2005 16:11


Sva vremena su po Griniču +2 h. Sada je 20:06.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com