PC Ekspert Forum

PC Ekspert Forum (https://forum.pcekspert.com/index.php)
-   Web dizajn, programiranje i ostalo (https://forum.pcekspert.com/forumdisplay.php?f=39)
-   -   C++ dynamic memory allocation i arrayi (https://forum.pcekspert.com/showthread.php?t=145060)

Lvx Demos 15.04.2009. 17:09

C++ dynamic memory allocation i arrayi
 
Molio bih pomoć oko dvije stvari koje me muče.

1) Kako koristeći dynamic memory allocation stvoriti više dimenzionalan array koristeći varijable kao veličine arraya, npr. array[x][y] gdje su x i y varijable?

2) Želim imati funkciju koja bi učitavala vrijednosti sa konzole (dok se ne učita neki znak, npr. 0) te ih dodavala u array ali tako da duljina arraya nije predodređena - znači tako da se array "produlji" za jedno mjesto sa svakim učitanim brojem. Ako bi mi dali primjer (može i pseudokod), bi bih vrlo zahvalan.

Hvala!

Bubba 15.04.2009. 17:14

Citiraj:

Autor Lvx Demos (Post 1323048)
1) Kako koristeći dynamic memory allocation stvoriti više dimenzionalan array koristeći varijable kao veličine arraya, npr. array[x][y] gdje su x i y varijable?

malloc();/calloc();
Citiraj:

2) Želim imati funkciju koja bi učitavala vrijednosti sa konzole (dok se ne učita neki znak, npr. 0) te ih dodavala u array ali tako da duljina arraya nije predodređena - znači tako da se array "produlji" za jedno mjesto sa svakim učitanim brojem. Ako bi mi dali primjer (može i pseudokod), bi bih vrlo zahvalan.
realloc();

Dancho 16.04.2009. 13:52

funkcije koje ti je Bubba naveo zapravo spadaju u C ( i mogu se naravno bez problema koristiti u C++),no C++ ima svoje operatore new i new[] za dinamicko alociranje memorije ( s pripadajucim delete i delete [] operatorima ),
dakle,
1.) new[] , pa kasnije delete[]
2.) recimo nesto od stl-a, std::vector<>

Probaj nesto sam napisati, pa ako zapnes postaj kod pa ce ti vec netko pomoci...

thopok 16.04.2009. 13:57

Citiraj:

no C++ ima svoje operatore
I ja se pitam kako bi išlo u "čistom" C++.


How to create dynamic array

Bubba 16.04.2009. 15:30

Citiraj:

Autor Dancho (Post 1323657)
funkcije koje ti je Bubba naveo zapravo spadaju u C ( i mogu se naravno bez problema koristiti u C++),no C++ ima svoje operatore new i new[] za dinamicko alociranje memorije ( s pripadajucim delete i delete [] operatorima ),

Nisam ljubitelj C++-a, no nisu li new i delete ujedino i pozivi na konstruktor odnosno destruktor neke klase? Je li sigurno pozivati new nad obicnim poljem tj. objektom koji nema strogo definirane konstruktor/destruktor (specijalno i STL-ovi)?

Uz to, nisam siguran radi li new na multidimenzionalnim poljima. Ako mu treba takvo sto, neka radje koristi neki vec multidimenzionalno zamisljen STL, recimo multimap/multiset ili nesto u tom stilu...

Dancho 16.04.2009. 16:25

Naravno da svaki poziv na new je i ujedno i poziv na konstruktor tog tipa kao sto je i delete poziv na destruktor,nadalje svaki vraceni pointer se provjerava na dva moguca nacina:
1.tzv exception method ( sto je defaultni nacin )
int* array=new int[5];
exception tipa bad_alloc je bacen ako alociranje nije proslo
2.tzv nothrow metoda
int* array=new (nothrow) int[5];
(if array==NULL)
; // error prilikom alociranja

multi polje se kreira kao 1.dimenzionalno (row_size*col_size) te se indeksira
index=column + row_size * row
ili se moze upotrijebiti boost::multi_array class :)

Bubba 16.04.2009. 18:13

Citiraj:

Autor Dancho (Post 1323790)
Naravno da svaki poziv na new je i ujedno i poziv na konstruktor tog tipa kao sto je i delete poziv na destruktor

Ok, ali sto je konstruktor a sto destruktor u inicijalizaciji polja?

No sve na stranu to, jeftini "trik" sa prosirivanjem polja pod krinkom visedimenzionalnosti uopce nije ni blizu onome sto malloc radi pri kreiranju visedimenzionalnog polja.

Dancho 16.04.2009. 18:37

Citiraj:

Autor Bubba (Post 1323859)
Ok, ali sto je konstruktor a sto destruktor u inicijalizaciji polja?

To naravno ovisi o tipu objekta ( built-in ili user-defined )...

Citiraj:

Autor Bubba (Post 1323859)
No sve na stranu to, jeftini "trik" sa prosirivanjem polja pod krinkom visedimenzionalnosti uopce nije ni blizu onome sto malloc radi pri kreiranju visedimenzionalnog polja.

Naravno,ovaj "trik" je tek jedna od mogucnosti za kreiranje multi-polja,drugi nacini su donekle slozeniji i OT,
no new moze sve sto moze i malloc pa i bolje ( IMHO ),nezeleci pri tome da ulazim u raspravu s ( ocito ) C programerom ;)

pozdrav

Bubba 16.04.2009. 18:52

Citiraj:

Autor Dancho (Post 1323872)
To naravno ovisi o tipu objekta ( built-in ili user-defined )...

Recimo, za polje pointera na integere?

Code:

int *ptr1 = &a[0], *ptr2 = &a[10], *ptr3 = &a[100];
int *ptrs[] = { ptr1, ptr2, ptr3 }

Sto ovdje predstavlja konstruktor a sto destruktor ako bi se htjelo napraviti polje ptrs?

Citiraj:

Naravno,ovaj "trik" je tek jedna od mogucnosti za kreiranje multi-polja,drugi nacini su donekle slozeniji i OT,
Ali to nije kreiranje visedimenzionalnog polja, nego prljavo baratanje s jednodimenzionalnim poljem, sto je tesko isto...

Osobno, ne znam kako bi se to izvelo, pa ako ti nije tesko objasniti ukratko ili barem baciti kakvu referencu ili link.

Citiraj:

no new moze sve sto moze i malloc pa i bolje ( IMHO ),
U njegovom slucaju, nisam bas siguran, jer malloc(); ima realloc(); koji njemu treba, dok sa new to ide kud i kamo teze.

Citiraj:

nezeleci pri tome da ulazim u raspravu s ( ocito ) C programerom ;)
pozdrav
Istina jest da primarno prica C, no imao sam vecih ili manjih doticaja i s drugim programskim jezicima, pogotovo C++-om.

Bilo kako bilo, standardni C++ libovi ukljucuju i C90 biblioteke medju kojima je i malloc();,, tako da... :p ;)

Dancho 16.04.2009. 19:33

ahh nedas se ti :) , nu dobro,

U C++ pojam konstruktora se prosirio i na built-in tipove podataka i jednostavno znaci dodjelu ( assignment )
neke vrijednosti nekoj varijabli prilikom definicije,dakle
1.) C
float pi=3.14159;
2.) C++
float pi(3.14159);
Vjerujem da ti je onda jasno u tvojem primeru sta je sta,
naravno destruktor je onda samo pitanje scopa.

sto se tice multipolja s operatorom new link je tu,malo je suhoparno za citati ali dobro objasnjava nacine alociranja,ako je potrebno mogu dati i druge( koji ukljucuje TMP i slicne nacine )...

Sto se tice c funkcija u c++ preporucljivo je da se koriste novi headeri ( cstdlib i sl. ) samo zbog namespace problematike,ali u svakom slucaju c ima ogroman broj funkcija koje i ja takodjer koristim ...


Sva vremena su GMT +2. Sada je 23:45.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 1999-2024 PC Ekspert - Sva prava pridržana ISSN 1334-2940
Ad Management by RedTyger