Forum » Programiranje » [C++] Ali je mogoče?
[C++] Ali je mogoče?
Ciklamen ::
Pozdrav.
Moje vprašanje se glasi: imam array, ki ga deklariram v mainu, zapolnim ga pa v eni funkciji, kako naj potem iz te funkcije obdržim vrednosti v arrayju za celoten program? Če obstaja kakšna druga metoda kot globalni array ali pointerji?
Torej če ponakažem z kodo:
Moje vprašanje se glasi: imam array, ki ga deklariram v mainu, zapolnim ga pa v eni funkciji, kako naj potem iz te funkcije obdržim vrednosti v arrayju za celoten program? Če obstaja kakšna druga metoda kot globalni array ali pointerji?
Torej če ponakažem z kodo:
void funkcija(int array, int velikost) { for zanka za zapolnitev arraya } main { int array int velikost arraya funkcija(array, velikost arraya) }
- End of the Post ->
kr?en ::
Saj v funkcijo dobis samo referenco do arraya, ne nucas nic vracat. Bi se morala sprememba arraya odrazat tudi naprej v main metodi. Pa zakaj nucas podajati se parameter velikost? Se ne da dobit dolzino tabele iz array.lenght() (oz. w/e se dobi dolzina tabele v C++)?
Govorim malo iz glave. Nimam blage kako tocno zadeve funkcionirajo v C++. Verjetno podobno kot v Javi.
Govorim malo iz glave. Nimam blage kako tocno zadeve funkcionirajo v C++. Verjetno podobno kot v Javi.
Mavrik ::
Ciklamen:
Gremo po vrsti:
1.) V C++ se načeloma preferira da namesto arrayev uporabljaš std::vector, kjer potem tvoj vzorec zgleda tako, da (prazen) vektor inicializiraš na začetku in ga podaš v vse komponente, ki ga uporabljajo (pazi da vektorja ne skopiraš ;) )
Npr.:
2.) Če prva opcija ni kul podajaš v vse komponente in funkcije kazalec na array. Ta opcija sicer ni tako priporočljiva, ker boš mel probleme z memory managementom in moraš konstantno vlačiti sabo stvari ko je dolžina in podobno.
Ne, nima. Ne govoriti na pamet, in ne, ni podobno kot v Javi.
Gremo po vrsti:
1.) V C++ se načeloma preferira da namesto arrayev uporabljaš std::vector, kjer potem tvoj vzorec zgleda tako, da (prazen) vektor inicializiraš na začetku in ga podaš v vse komponente, ki ga uporabljajo (pazi da vektorja ne skopiraš ;) )
Npr.:
void napolniVektor(std::vector<int>& vektor) { vektor.push_back(3); } int main() { std::vector<int> blarg; napolniVektor(blarg); tuRabimVektor(blarg); }
2.) Če prva opcija ni kul podajaš v vse komponente in funkcije kazalec na array. Ta opcija sicer ni tako priporočljiva, ker boš mel probleme z memory managementom in moraš konstantno vlačiti sabo stvari ko je dolžina in podobno.
void napolniArray(int* array, int len) {} int main() { int* array = new int[15]; napolniArray(array, 15); tuRabimArray(array, 15); delete[] array; }
Saj v funkcijo dobis samo referenco do arraya, ne nucas nic vracat. Bi se morala sprememba arraya odrazat tudi naprej v main metodi. Pa zakaj nucas podajati se parameter velikost? Se ne da dobit dolzino tabele iz array.lenght() (oz. w/e se dobi dolzina tabele v C++)?
Govorim malo iz glave. Nimam blage kako tocno zadeve funkcionirajo v C++. Verjetno podobno kot v Javi.
Ne, nima. Ne govoriti na pamet, in ne, ni podobno kot v Javi.
The truth is rarely pure and never simple.
Zgodovina sprememb…
- spremenil: Mavrik ()
techfreak :) ::
Kakšna je razlika med 2. opcijo in:
array[x] bo kazal na isto lokacijo tako v main kot v napolniArray funkciji.
void napolniArray(int array[], int len) {} int main() { int array[15]; napolniArray(array, 15); tuRabimArray(array, 15); }
array[x] bo kazal na isto lokacijo tako v main kot v napolniArray funkciji.
Mavrik ::
Array si alociral na stacku, ne na heapu. V tvojem primeru ne bo težav, samo če boš naredil to v takem vrstnem redu, da bo padel array iz scopa, boš ostal s pointerjem, ki kaže na karnekaj :)
Recimo:
Načeloma je ko imaš C++ v 99% boljše uporabljati std::vector in podajati reference, ker se izogneš ogromno problemom.
Recimo:
int* vrniArray() { int array[15]; return &array; } int main() { int* array = vrniArray(); int x = array[2]; // BUM }
Načeloma je ko imaš C++ v 99% boljše uporabljati std::vector in podajati reference, ker se izogneš ogromno problemom.
The truth is rarely pure and never simple.
Ciklamen ::
Mavrik, mi je poznana uporaba vectorja, ampak ga v tem primeru ne smem uporabiti :) Gre za nalogo za študij, dalje pa veš kako je :)
Seveda bi bilo lažje z vectorjem, ampak "moram" uporabit array :)
Drugače pa hvala za odgovore, zelo koristno!
Seveda bi bilo lažje z vectorjem, ampak "moram" uporabit array :)
Drugače pa hvala za odgovore, zelo koristno!
- End of the Post ->
Blazzz ::
Ce uporabljas novejsi prevajalnik bo tudi spodnja koda delovala brez kopiranja.
std::vector<int> napolni() { std::vector<int> v; ... return v; } int main() { std::vector<int> v = napolni(); ... }
darkkk ::
malo sem že pozabil sintakso, ampak v splošnem lahko greš takole (zamenjaj malloc z new, free z delete, ... ):
Ampak da forsirajo še vedno te "bedarije" (sej je nujno za razumevanje konceptov, sam... ), ko potem vedno uporabiš vector (oz. list če rabiš bolj dinamično dolžino)
Ampak da forsirajo še vedno te "bedarije" (sej je nujno za razumevanje konceptov, sam... ), ko potem vedno uporabiš vector (oz. list če rabiš bolj dinamično dolžino)
void napolni(int *a, int len) { for(int i=0; i<len;i++) a[i] = i; //napolniš od 0 do len-1 } int main(void) { int len = 15; int *a = malloc(sizeof(int) * len); //c++ bo menda int *a = new int[len]; napolni(a, len); free(a);//delete a }
Zgodovina sprememb…
- spremenil: darkkk ()
Ciklamen ::
Hvala fantje, sem že rešil, failal sem s samo inicializacijo, ko je nisem inicializiral pravilno :D *facepalm*
Imam pa še eno vprašanje, namreč kako bi generiral random double številke (do dve decimalni mesti - gre za random stroške). Nekaj sem googlal pa nisem nič pametnega/koristnega našel.
Zdaj imam rand()%100+1 da mi generira random integerje do 100, rad bi pa random double števila do 100 ali do dohodek (ki ga vpiše uporabnik na začetku programa). Upam da je razumljivo kaj bi rad dosegel :)
Imam pa še eno vprašanje, namreč kako bi generiral random double številke (do dve decimalni mesti - gre za random stroške). Nekaj sem googlal pa nisem nič pametnega/koristnega našel.
Zdaj imam rand()%100+1 da mi generira random integerje do 100, rad bi pa random double števila do 100 ali do dohodek (ki ga vpiše uporabnik na začetku programa). Upam da je razumljivo kaj bi rad dosegel :)
- End of the Post ->
darkkk ::
http://www.cplusplus.com/reference/cstd...
Torej: int X = rand() je celoštevilska naključna spremenljivka med 0 in RAND_MAX
Ti bi rad neki med 0 in y (user defined...)
double x = (double)X // tole ti pretvori v double, drgač je rezultat naslednjega deljenja enak 0.
x = x/RAND_MAX; //maš slučajno spremenljivko na [0,1]
x = x * y; /// maš neki uniformno med 0 in y.
Torej: int X = rand() je celoštevilska naključna spremenljivka med 0 in RAND_MAX
Ti bi rad neki med 0 in y (user defined...)
double x = (double)X // tole ti pretvori v double, drgač je rezultat naslednjega deljenja enak 0.
x = x/RAND_MAX; //maš slučajno spremenljivko na [0,1]
x = x * y; /// maš neki uniformno med 0 in y.
amacar ::
Če bi rad do 100, pač generiraš random do 10000 pa potem deliš s 100 pa je. Ne vem, zakaj bi kombliciral.
Ciklamen ::
It's all good fantje, je bilo dovolj da generiram rand()%y :)
Ampak v prihajajočih tednih lahko pričakujete še več neumnih vprašanj :P
Ampak v prihajajočih tednih lahko pričakujete še več neumnih vprašanj :P
- End of the Post ->
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [cpp]Kako ugotoviti koliko zapisov je v arrayu?Oddelek: Programiranje | 820 (739) | technolog |
» | asp.net vprašanjeOddelek: Programiranje | 1109 (730) | vojko20 |
» | [c++] Pomoč pri izdelavi std::vector "wrapperja"Oddelek: Programiranje | 1575 (1476) | zhigatsey |
» | Pointer-ji v C-juOddelek: Programiranje | 1769 (1467) | rokpok |
» | C++ in tabeleOddelek: Programiranje | 3325 (3146) | BigWhale |