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

Funkcija koja vraca array?

[es] :: C/C++ programiranje :: Funkcija koja vraca array?

Strane: 1 2

[ Pregleda: 6971 | Odgovora: 32 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

drugtito
Milovan Djilas

Član broj: 138118
Poruke: 56
*.dynamic.sbb.rs.



+1 Profil

icon Funkcija koja vraca array?08.06.2008. u 13:38 - pre 193 meseci
POzdrav svima
da li postoji mogucnost da funkcija vrati niz
kao:

int * Fu()
{
int x[3] = {11,15,9};
return x;
};

Tacnije na koji nacin i kako da iz funkcije vratim niz?

pozdrav
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 13:50 - pre 193 meseci
Treba da vratiš pokazivač na prvi element, kao i broj elemenata niza. Niz unutar funkcije moraš deklarisati kao statički ili ga kreirati u memoriju operatorom new.

Code:
#include <iostream>

int* Fu(int *n)
{
    static int x[3] = {11,15,9};
        //može i: int x  = new int[3];
        *n = 3;
    return x;
};


int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int *niz;
    niz = Fu(&n);
    
    for(int i = 0; i < n; i++)
        std::cout << niz[i] << std::endl;

    return 0;
}


Nadam se da ne pišeš višenitnu aplikaciju - static u tom slučaju ume veoma da zagorča život.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 15:34 - pre 193 meseci
Citat:
@Burgos
Nadam se da ne pišeš višenitnu aplikaciju - static u tom slučaju ume veoma da zagorča život.


@drugtito
Ako pises visenitnu aplikaciju ili ako koristis new operator da bi kreirao niz
obavezno brisi memoriju koju si alocirao unutar funkcije koja ti vraca niz :
Code:

int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int *niz;
    niz = Fu(&n); // kreirao si niz sa  int* x  = new int[3];
    
    for(int i = 0; i < n; i++)
        std::cout << niz[i] << std::endl;

    delete [] niz ; // dodato ... 
    return 0;
}


U tvom primeru :
Code:

int * Fu()
{
int x[3] = {11,15,9};
return x;

};

vracas null (prazan) pointer jer niz x je lokalna promenljiva u funkciji i brise se sa stack-a odmah po izlasku iz funkcije
Viva lollapalooza
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 19:28 - pre 193 meseci
@drugtito
Ili jednostavno ne moraš previše da se mučiš da razmišljaš gde si šta oslobodio.. koristi vector ako ti ne smeta. Ili ako ti smeta, koristi pametne pokazivače kao wrapper oko tog niza..i ne razmišljaš o oslobađanju...
 
Odgovor na temu

BinaryRuler

Član broj: 73518
Poruke: 189
77.46.183.*



+3 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 21:59 - pre 193 meseci
Mislim da ti je naj sigurnije da vratis niz kroz parametar.

Code:

void Fu(int *x)
{
    x[0] = 11;
    x[1] = 15;
    x[2] = 9;


};

int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int niz[3];
    Fu(niz);
    for(int i = 0; i < 3; i++)
        std::cout << niz[i] << std::endl;
    system("PAUSE");
    return 0;
}
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 22:12 - pre 193 meseci
Mislim da je ovo mnogo nesigurnije, iz prostog razloga što ne prosleđuješ i broj elemenata niza.

A zašto bi takav pristup bio sigurniji? Ne vidim razliku između kreiranja memorije unutar spoljne i unutrašnje funkcije. Možda je lakši pristup, ne zahteva new i delete operatore, ali uvodi više ograničenja.

PS. Moram se osloboditi nekih gadnih navika ;). Prvobitni kod bih napisao ovako:

Code:

#include <iostream>

int* Fu(int &n)
{
    static int x[3] = {11,15,9};
    //int *x = new int[3];
    //x = {11,15,9};
    n = 3;
    return x;
};


int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int *niz;
    niz = Fu(n);
    
    for(int i = 0; i < n; i++)
        std::cout << niz[i] << std::endl;

    return 0;
}


I da dodam, ne vidim prednost korišćenja C nizova, umesto kontejnera vector. Mislim da bi to bilo najbolje.

[Ovu poruku je menjao Burgos dana 08.06.2008. u 23:26 GMT+1]
 
Odgovor na temu

BinaryRuler

Član broj: 73518
Poruke: 189
77.46.183.*



+3 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 22:25 - pre 193 meseci
Code:

void Fu(int *x, int *n)
{
    x[0] = 11;
    x[1] = 15;
    x[2] = 9;
    *n=3;


};

int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int niz[3];
    Fu(niz,&n);
    for(int i = 0; i < 3; i++)
        std::cout << niz[i] << std::endl;
    system("PAUSE");
    return 0;
}


Ok evo ispravio sam, mislio sam da se podrazumeva da mora da vrati br elemenata.
Ne vidim zasto bi bio ogranicen ovakvim pristupom?
 
Odgovor na temu

BinaryRuler

Član broj: 73518
Poruke: 189
77.46.183.*



+3 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 22:31 - pre 193 meseci
Code:

void Fu(int *x, int *n)
{
    delete []x;
    x = new int [10];
    for(int i=0; i<10; i++)
        x[i]=i+1;
    
    *n=10;


};

int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int* niz=new int[3];
    Fu(niz,&n);
    for(int i = 0; i < n; i++)
        std::cout << niz[i] << std::endl;
    system("PAUSE");
    return 0;
}


Evo primera sa redimenzionisanjem.

A kroz parametar je sigurnije zbog one price sa stackom sto je rekao deerbeer.
I ako hoces da izbegnes static.
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 23:09 - pre 193 meseci
?

Code:
#include "stdafx.h"
#include <iostream>

int* Fu(int *n)
{
    int *x = new int[3];
    x[0] = 11;
    x[1] = 15;
    x[2] = 9;
    *n = 3;
    return x;
};


int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int *niz;
    niz = Fu(&n);

    for(int i = 0; i < n; i++)
        std::cout << niz[i] << std::endl;

    delete []niz;
    return 0;
}


Interesuje me šta se dešava sa preostalih 7 članova niza koje si napravio u funkciji, kada se obriše int[3], tj. kada program izađe iz oblasti važenja (dešava se da memorija curi).

Evo i napismeno:

Code:
Detected memory leaks!
Dumping objects ->
{167} normal block at 0x002281B8, 40 bytes long.
 Data: <                > 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 
Object dump complete.


Code:
#include "stdafx.h"
#include <iostream>
#include  "crtdbg.h"

void Fu(int *x, int *n)
{
    delete []x;
    x = new int [10];
    for(int i=0; i<10; i++)
        x[i]=i+1;

    *n=10;


}

int _tmain(int argc, _TCHAR* argv[])
{
    #ifndef NDEBUG
        int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
        flag |= _CRTDBG_LEAK_CHECK_DF;
        _CrtSetDbgFlag(flag); 
    #endif
    #ifdef _DEBUG
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #endif

    int n;
    int* niz=new int[3];
    Fu(niz,&n);
    for(int i = 0; i < n; i++)
        std::cout << niz[i] << std::endl;
    system("PAUSE");
    return 0;
}

 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 23:25 - pre 193 meseci
Citat:
@SkyDiver
Mislim da ti je naj sigurnije da vratis niz kroz parametar.

Pitanje je bilo kako funkcija da vrati tj. da kreira niz ....
Tvoj primer pokazuje kako popuniti niz u okviru neke funkcije ..a sta ako ne znas unapred koliki ce taj niz biti ..
onda bi morao da koristis new operator ili
std::vector u samoj funkciji sto je najbolje resenje

Citat:
@Goran Arandjelovic
Ili jednostavno ne moraš previše da se mučiš da razmišljaš gde si šta oslobodio.. koristi vector ako ti ne smeta. Ili ako ti smeta, koristi pametne pokazivače kao wrapper oko tog niza..i ne razmišljaš o oslobađanju...

std::vector je ok za primitivne tipove ...
ali ako hoce da drzi objekte ili strukture a da nisu pointeri (tj. dinamicki kreirani objekti sa new operatorom) u vector listi
morace da napravi copy-construktor za svaku klasu ili strukturu , onda ce svaki clan te vector liste sadrzati kopiju sa stack-a .
i ne mora da poziva delete za svaki kao sto je slucaj ako ima pointer na kreirani objekat na heap-u ...

Ne znam koliko ima smisla pricati unapred
(@drugtito se nije jos ni oglasio povodim prethodnih nasih postova :)
ako mu dosad nesto nije bilo jasno ...


PS:
Drug Tito je rekao :
Studenti su u pravu !!!!!
- Jubilarna 40 godina od studentskog protesta '68 -
http://glassrbije.org/index.ph...iew&id=12516&Itemid=30


Viva lollapalooza
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Funkcija koja vraca array?08.06.2008. u 23:38 - pre 193 meseci
Citat:
deerbeer: std::vector je ok za primitivne tipove ...
ali ako hoce da drzi objekte ili strukture a da nisu pointeri (tj. dinamicki kreirani objekti sa new operatorom) u vector listi
morace da napravi copy-construktor za svaku klasu ili strukturu , onda ce svaki clan te vector liste sadrzati kopiju sa stack-a .
i ne mora da poziva delete za svaki kao sto je slucaj ako ima pointer na kreirani objekat na heap-u ...

Ne znam koliko ima smisla pricati unapred
(@drugtito se nije jos ni oglasio povodim prethodnih nasih postova :)
ako mu dosad nesto nije bilo jasno ...


:)

Heh..da, vidim da se nije oglasio, a mi se raspričali možda malo više, ali kad već jesmo moraću da kažem da nije toliko bitno jesu ili ne primitivni tipovi.

1) Može i sam vektor da drži na heapu i da ima wrapper oko njega (čitaj: neki smart pointer), tako da nebi bilo kopiranja celog vektora.
2) Ili lepo može da implementira Move Constructor u svakom svom tipu i to je to...nema duplog kopiranja objekta, kod return poziva (a kad dođu rvalue reference u novom Std-u, onda nema problema :))

ali ovo je malo previše..:))) skrenuo sam s teme... :)

[Ovu poruku je menjao Goran Arandjelovic dana 09.06.2008. u 00:49 GMT+1]
 
Odgovor na temu

drugtito
Milovan Djilas

Član broj: 138118
Poruke: 56
*.dynamic.sbb.rs.



+1 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 00:32 - pre 193 meseci
POzdrav
elem Hvala na odgovorima, pomogli ste mi.
Nego poEnta je
da sam zacrtao da funkcija vrati niz i to ti je :)
znam da imam jos drugih resenja, ali..............
srbin je to, inat.

Hvala jos jednom svim DRUGOVIMA :)

"Drugovi, pred nama su odlučujući dani. Naprijed sada u konačnu pobjedu! Iduću konferenciju moramo održati u oslobođenoj zemlji i od tuđina i od kapitalista!"
??.10.1940
Drug Tito - From Wikipedia

[Ovu poruku je menjao drugtito dana 09.06.2008. u 01:42 GMT+1]

[Ovu poruku je menjao drugtito dana 09.06.2008. u 01:43 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

BinaryRuler

Član broj: 73518
Poruke: 189
*.ADSL.neobee.net.



+3 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 07:17 - pre 193 meseci
deerbeer, ja sam redimenzionisao niz u funkciji i to radi odlicno, ti u funkciju uvek mozes da redimenzionises niz na isti nacin.

Code:

void Fu(int *x, int *n)
{
    delete []x;
    x = new int [10];
    for(int i=0; i<10; i++)
        x[i]=i+1;
    
    *n=10;


};

int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int* niz=new int[3];
    Fu(niz,&n);
    for(int i = 0; i < n; i++)
        std::cout << niz[i] << std::endl;
    system("PAUSE");
    return 0;
}
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 08:54 - pre 193 meseci
Citat:
SkyDiverX: deerbeer, ja sam redimenzionisao niz u funkciji i to radi odlicno, ti u funkciju uvek mozes da redimenzionises niz na isti nacin.

Izvini moj komentar se odnosio se na drugi primer :
Code:

void Fu(int *x, int *n)
{
    x[0] = 11;
    x[1] = 15;
    x[2] = 9;
    *n=3;
};
int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int niz[3];
    Fu(niz,&n);
    for(int i = 0; i < 3; i++)
        std::cout << niz[i] << std::endl;
    system("PAUSE");
    return 0;
}


Ok .. postoje mnogo nacina u C++-u da se ovo uradi ... sve zavisi od afiniteta i znanja onog koji ga implementira...
Svaki predlog je u principu dobar i ima svoju primenu ...

Viva lollapalooza
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 09:36 - pre 193 meseci
Ponovo ti kažem da ovaj kod izaziva memory-leak. Nedostaje ti
Code:
delete []niz
pre izlaska iz glavne f-je.

Čak i u ovom slučaju:

Code:
void Fu(int *x, int *n)
{
    delete []x;
    x = new int [2];
    for(int i=0; i<2; i++)
        x[i]=i+1;

    *n=2;

}


Dolazi do leak-a. Sve u svemu, jako loš pristup. Treba izbegavati redimenzionisanje niza kreiranog u nekom drugom bloku.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 10:03 - pre 193 meseci
Citat:
Burgos: Ponovo ti kažem da ovaj kod izaziva memory-leak. Nedostaje ti
Code:
delete []niz
pre izlaska iz glavne f-je.

Čak i u ovom slučaju:

Code:
void Fu(int *x, int *n)
{
delete []x;
x = new int [2];
for(int i=0; i<2; i++)
x[i]=i+1;

*n=2;

}


Dolazi do leak-a. Sve u svemu, jako loš pristup. Treba izbegavati redimenzionisanje niza kreiranog u nekom drugom bloku.


Heh...tek ovo što si napisao ne smeš da radiš...

Code:
void Fu(int *x, int *n)
{
delete []x; // otkud znas da je ovaj niz na heapu, a ne na stacku?!

x = new int [2];
for(int i=0; i<2; i++)
x[i]=i+1;

*n=2;

}


Prvo bi trebalo da ispitaš da li je određeni niz (ako je prosleđen pokazivač na njega) na heapu ili na stacku.
Ovo je, generalno, nemoguće portabilno uraditi...ali je moguće sledeće (uz uslov da se zna da niz sigurno nije static)

Code:


int na_heapu(void *p)
{
  char c; // sada znamo da je ovaj jedan bajt na vrhu steka
  if((int)p < (int)&c){
    //p pokazuje na heap (ili mozda static?, ali smo izuzeli taj slucaj)
    return(1);
  }else{
    //p pokazuje na stack
    return(0);
  }
}



Ovo je "prljavo", tako da ne preporučujem...ali može da prođe ok.

Sasvim je bezbedno uraditi ovo... što će dobro raditi ako je niz na stacku ili na heapu...

Code:

void Fu(int *x, int *n, int maxelem)
{
    // ovde maxelem oznacava da je maksimalan broj elemenata 3,
    // jer inace tu informaciju nismo imali...

    x[0] = 11;
    x[1] = 15;
    x[2] = 9;
    *n=3;

    // i ova izmena elemenata jeste sasvim bezbedna
    // i ova funckija nebi trebalo da ima odgovornost za brisanje niza ni u kom slucaju...
};
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 10:42 - pre 193 meseci
Ne radim to ja, pokazivao sam SkyDiverXu da je to jedan užasan i krajnje opasna tehnika - redimenzionisanje niza, odn. petljanje sa memorijom nastalom na nekom drugom mestu.

Citat:
Goran Arandjelovic:
Prvo bi trebalo da ispitaš da li je određeni niz (ako je prosleđen pokazivač na njega) na heapu ili na stacku.
Ovo je, generalno, nemoguće portabilno uraditi...ali je moguće sledeće (uz uslov da se zna da niz sigurno nije static)



Reference: Art Of Programming: "Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat." ;)

Citat:
Goran Arandjelovic:
Sasvim je bezbedno uraditi ovo... što će dobro raditi ako je niz na stacku ili na heapu...

Code:

void Fu(int *x, int *n, int maxelem)
{
    // ovde maxelem oznacava da je maksimalan broj elemenata 3,
    // jer inace tu informaciju nismo imali...

    x[0] = 11;
    x[1] = 15;
    x[2] = 9;
    *n=3;

    // i ova izmena elemenata jeste sasvim bezbedna
    // i ova funckija nebi trebalo da ima odgovornost za brisanje niza ni u kom slucaju...
};


Da, sasvim je bezbedna, jer se ne petlja sa memorijom. SkyDividerX je naveo primer kako redimenzionisati prosleđen niz, a ja sam samo rekao kako je to nebezbedna taktika, što si i ti pokazao navedenim primerima.
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 10:44 - pre 193 meseci
Citat:
Goran Arandjelovic: Heh...tek ovo što si napisao ne smeš da radiš...

Code:
void Fu(int *x, int *n)
{
delete []x; // otkud znas da je ovaj niz na heapu, a ne na stacku?!



Ne znam, zato sam i rekao da je opasno. Pored problema nastalih curenjem memorije, moguće su i dalje komplikacije. Nije to moj kod:

Citat:
SkyDiverX:
Code:

void Fu(int *x, int *n)
{
delete []x;
x = new int [10];
for(int i=0; i<10; i++)
x[i]=i+1;

*n=10;


}

 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 11:49 - pre 193 meseci
@Burgos
Izvini, nisam video da nije tvoj kod... :)
--
Mislim da nije samo Art of Programming...ne znam odakle mi to tacno. :)



Edit:
@Burgos
Sad vidim tvoj potpis... Linus bi me verovatno iskritikovao za ovo oko portabilnosti... :))
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Funkcija koja vraca array?09.06.2008. u 11:59 - pre 193 meseci
Nema problema :).

A za Linusa - ko ga šiša ;).
 
Odgovor na temu

[es] :: C/C++ programiranje :: Funkcija koja vraca array?

Strane: 1 2

[ Pregleda: 6971 | Odgovora: 32 ] > FB > Twit

Postavi temu Odgovori

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