» »

[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:

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 ->

kihc ::

Zakaj ne bi naredil, da funkcija vrne kar array (int[]), namesto void?
x

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.

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.:


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;
}



kr?en je izjavil:

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 ()

kr?en ::

No kul :)

techfreak :) ::

Kakšna je razlika med 2. opcijo in:
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:


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.

techfreak :) ::

Heh nisem niti pomislil na to.

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!
- 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)

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 :)
- 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.

amacar ::

Če bi rad do 100, pač generiraš random do 10000 pa potem deliš s 100 pa je. Ne vem, zakaj bi kombliciral.

darkkk ::

x = (double)rand() * y / RAND_MAX;

komplicirano?

amacar ::

Ne vrne na 2 decimalki.

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
- End of the Post ->


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[cpp]Kako ugotoviti koliko zapisov je v arrayu?

Oddelek: Programiranje
6776 (695) technolog
»

asp.net vprašanje

Oddelek: Programiranje
71060 (681) vojko20
»

[c++] Pomoč pri izdelavi std::vector "wrapperja"

Oddelek: Programiranje
81512 (1413) zhigatsey
»

Pointer-ji v C-ju

Oddelek: Programiranje
291691 (1389) rokpok
»

C++ in tabele

Oddelek: Programiranje
113234 (3055) BigWhale

Več podobnih tem