Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

dinamicka polja - brojanje elemenata

[es] :: C/C++ programiranje :: dinamicka polja - brojanje elemenata

[ Pregleda: 3413 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

z@re
Zarko Bulatovic
Split

Član broj: 29849
Poruke: 443
*.cmu.carnet.hr.



+25 Profil

icon dinamicka polja - brojanje elemenata21.07.2005. u 01:17 - pre 228 meseci
deklariram pointer na tip, i onda s nekom od memory handling funkcija alociram dovoljno memorije za polje na koje pokazuje taj pointer. recimo polje za 7 integera :

Code:


int *x;
x = (int *)malloc(7 * sizeof(int));



kako onda izbrojit koliko elemenata polje ima? jer onaj kod za brojanje elemenata koji sluzi za brojat staticki alocirana polja [ n = (sizeof(a) / sizeof(a[0]); ] ne radi, a po logici i nebi trebao radit, ali sam svejedno isprobao.

Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
 
Odgovor na temu

vladab
Vladimir Bašanović
Beograd

Član broj: 9512
Poruke: 498
*.etf.bg.ac.yu.



Profil

icon Re: dinamicka polja - brojanje elemenata21.07.2005. u 09:10 - pre 228 meseci
Pa, kada pravis, ti mu zadajes koliko ce imati polja. U tvom slucaju 7.
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: dinamicka polja - brojanje elemenata21.07.2005. u 10:58 - pre 228 meseci
Citat:
n = (sizeof(a) / sizeof(a[0]);

Ovo nebi trebalo raditi (po logici) nikako, jer je to ovo n = (sizeof(int*) / sizeof(int);

Citat:
Pa, kada pravis, ti mu zadajes koliko ce imati polja. U tvom slucaju 7.

Dobro kaze, spremi u neku varijablu prilikom alokacije koliko si alocirao.
 
Odgovor na temu

mito61
Milovan Ivanovic
Beograd

Član broj: 63605
Poruke: 17
62.108.108.*



Profil

icon Re: dinamicka polja - brojanje elemenata21.07.2005. u 11:02 - pre 228 meseci
Pa, vec ti je kolega odgovorio, koliko trazis, toliko ces i da dobijes.
Hteo sam samo da ti ukazem na neke stvari ...

1. Dinamicka alokacija je potpuno drugaciji mehanizam u odnosu na staticku alokaciju. Operativni sistem u runtime-u, iz dela memorije koji se zove heap, dodeljuje (ako ima na raspolaganju) onoliko memorijskog prostora koliko si trazio. Znaci, ako si trazio niz od X intidzera, u tom nizu bice X clanova tipa intidzer,

2. OBAVEZNO !!! Nikada ne zaboravi da cekiras povratnu vrednost funkcije malloc !!! Sta vise, ovo vazi za SVE funkcije u C-u koje za povratnu vrednost imaju POINTER. Zasto? Zato sto sve te funkcije u slucaju greske vracaju NULL. Znaci, ako malloc ne moze da alocira odgovarajuci prostor u memoriji, vratice NULL (to jest, vrednost 0), pa ces ti doci u situaciju da 'tuces' u memorijsku lokaciju nula, sto ce izazvati runtime gresku. Zato su i uvedeni exception-i u C++.

3. I jos nesto - u vezi primera sa stringovima. Nikada ne alociraj prostor tacno u bajt: imas string od 12 slova i alociras prostor od 12 karaktera. I to je cesta pocetnicka greska. Jer si alocirao niz karaktera od 12 karaktera i trinaesti karakter, potpis[12], postavljas na nulu. Trebalo je da onda alociras 13 karaktera. Ovo je prost primer, inace u iole slozenijem primeru izazvao bi runtime gresku, jer bi pregazio bajt iza alociranog niza. Uvek alociraj prostor za stringove vise od duzine stringa (makar za jedan bajt). Inace, u pozivu malloc funkcije uvek koristi sizeof operator (recimo, 12 * sizeof ( char ) ).

Pozdrav
 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-65-34.noos.fr.



Profil

icon Re: dinamicka polja - brojanje elemenata21.07.2005. u 11:04 - pre 228 meseci

Code:

int *n;

  ...

n = malloc(7);


ili

Code:


int n[7];



u svakom slucaju funkcija strlen ne radi za int[], trebalo bi samo da odredis neki
broj koji ce ti sluziti kao end-of-array ( '\0' kad imas char*)

Pa eto ti resenja, umesto int* koristi char*...
Uglavnom je lakse manipulisati sa char*.

Pozdrav
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

mito61
Milovan Ivanovic
Beograd

Član broj: 63605
Poruke: 17
62.108.108.*



Profil

icon Re: dinamicka polja - brojanje elemenata21.07.2005. u 11:11 - pre 228 meseci
Ajde jos samo ovo, asocirao me odgovor drugog kolege:

'Ovo nebi trebalo raditi (po logici) nikako, jer je to ovo n = (sizeof(int*) / sizeof(int);'

Ime niza u C-u (mislim na staticki alocirani niz) je konstanta. Znaci snjom nema nikakve aritmetike i slicno. I ako se niz zove uuu, sasvim je legalno napisati sizeof (uuu) i dobicete velicinu niza.

Sto se dinamicki alociranog niza tice, vi dobijate samo pointer na pocetak tog niza. Pointer je promenljiva i sa njom mozete raditi takozvanu pointersku aritmetiku. Dalje, duzina pointera ne zavisi od tipa promenljive na koju ukazuje, vec od primenjenog memorijskog modela. Zato i ne radi formula za odredjivanje broja clanova kao u slucaju staticki alociranog niza, kao sto je to kolega lepo primetio i napisao. Ima o pointerima dosta da se pise, hteo sam samo da ukazem na razliku izmedju imena niza kao konstante, i pointera, kao promenljive.

Dosta od mene, nadam se da nisam preterao ...
 
Odgovor na temu

z@re
Zarko Bulatovic
Split

Član broj: 29849
Poruke: 443
*.cmu.carnet.hr.



+25 Profil

icon Re: dinamicka polja - brojanje elemenata21.07.2005. u 18:18 - pre 228 meseci
ljudi hvala na odgovorima, ali nisam nista pametniji. nije mi tesko u funkciju prosljedjivat pointer na polje, i broj elemenata polja (int *x, int n), ali zelim izbjec prosljedjivanje broja elemenata polja.

sta se tice projvere sta vraca malloc, realloc i slicno, to uvijek provjeravam da nije slucajno null. sta se tice koda u mom potpisu, alociran je jedan byte manje nego sta treba, ali mi se neda ispravljat potpis. zapravo mogao bih sada, posto je vec par ljudi ukazalo na to.

evo realan primjer zasto ja ovo pitam. radim funkciju koja konvertira decimalni u binarni broj. funkcija ne vraca integer koji ima binarne vrijednosti, nego polje integera, tako da je lakse manipulirati kasnije s bilo kojim bitom tog binarnog broja. dakle funkcija radi skolski, djeli decimalni broj sa dva i gleda na cjelobrojne ostatke. znaci prvo u while petlji djelim kopiju decimalnog broja sa dva, i inkrementiram brojac, da dobijem koliko bitova ima binarna reprezentacija. onda dinamicki alociram polje s tim brojem elemenata, pa opet djelim decimalni broj sa dva, i od kraja trpam bitove u polje. e sad...kako onda netko u main-u zna koliko bitova ima to polje

jer recimo [ int *binary = decl_to_binary(19); ] ce napravit to polje, ali se nezna koliko ima elemenata u polju, dakle bitova.

jedino sta sam uspio izimprovizirat da je funkcija deklarirana kao [ int *decl_to_binary (int x, int *n); ], pa u mainu pozivam [ int *binary = decl_to_binary(19, &broj_elemenata); ]. pa ce mi funkcija na kraju taj pointer n postavit na onaj svoj brojac, pa ja to dobijem kao broj_elemenata u mainu.

mozda bi i mogao koristiti neki broj za end of array. recimo, bilo koji broj koji nije 1 ili 0.

Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-65-34.noos.fr.



Profil

icon Re: dinamicka polja - brojanje elemenata21.07.2005. u 19:13 - pre 228 meseci
E z@re stvarno ti je bolje da za tvoj problem koristis char*
Kao prvo, u svakom trenutku znas koliko imas elemenata ( strlen() ),
kao drugo, mnogo manje memorije zauzimas ( sizeof char = 1, sizeof int = 4 !!! ),
posto u svaki element stavljas jednocifreni broj ( 0 ili 1 )...
Uopste ne vidim u cemu je problem, mozes ladno bez razmisljanja da stavis str[x] = 0 ili str[x] = 1
Hocu reci, sa charovima mozes da radis skoro sve sto radis sa intovima...

Nadam se da sam ti barem malo pomogao.

Ideja: mozes, ako bas hoces da se zezas sa int*, da, kao poslednji element stavis 2! ( binarni brojevi kao sto znamo, imaju samo nule i jedinice :) )

Pozdrav


"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

z@re
Zarko Bulatovic
Split

Član broj: 29849
Poruke: 443
*.cmu.carnet.hr.



+25 Profil

icon Re: dinamicka polja - brojanje elemenata22.07.2005. u 17:16 - pre 228 meseci
da, imas pravo, i to mi je palo napamet da char je bolji za ovaj konkretan primjer. medjutim, ovaj zadatak sam radio kao dio jedne vjezbe iz struktura podataka, prije nesto vremena, i sjetio sam se toga. uglavnom je trebalo decimalni konvertirat u binarni pa u polje charova. tako da bi bilo glupo konvertirat polje charova u polje charova, zar ne?

Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-65-34.noos.fr.



Profil

icon Re: dinamicka polja - brojanje elemenata22.07.2005. u 17:55 - pre 228 meseci
Pa naravno, posle sve zavisi od toga sta kaze zadatak...
Ponekad ima stvarno glupih zadataka...


"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

[es] :: C/C++ programiranje :: dinamicka polja - brojanje elemenata

[ Pregleda: 3413 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.