wyjscie funkcji tablica

0

Witam,
normalnie typ danych wyjsciowych funkcji opisujemy jako np

int nazwafunkcji (void) {return 0;}

a co jesli chcemy, zeby wyjsciem funkcji byla tablica?
analogogicznie do definiowania zmiennych proboje

int [] nazwa_funkcji () {return {0,0};}

, ale nie dziala,
w php, gdzie nie trzeba definiowac typow, to, o co mi chodzi mozna by przedstawic jako:

nazwa_funkcji () {return [0,0];}
0

Typ jaki funkcja będzie zwracać to int* i to będzie wskaźnik pokazujący na twoja tablicę. Ale musisz pamiętać ze jeśli tą tablicę tworzyłeś w bloku funkcji, to jest ona lokalna (więc wskaźnik na nią, niewiele ci daje).
Wtedy mozesz np. tablicę tworzyć przed wywołaniem funkcji, a potem referencje/wskaźnik do pierwszego elementu podać do funkcji jako argument.

0

Hmm gcc pod linuksem generuje ostrzezenie:

warning: address of local variable ‘tablica’ returned

Ale jednak działa.

0

Tylko warning ? Dziwne. Przecież jak wrzucimy cokolwiek na stos to już będzie po tablicy.

Co do zwracania tablicy - albo zwracamy vector<T>, albo nic nie zwracamy a jedynie operujemy na tablicy podanej jako parametr. A najlepiej jak będziemy operować na referencji do vector<T> podanej jako parametr:

void func(vector<int> &tablica)
{
  tablica.resize(2);
  tablica[0] = tablica[1] = 0;
}

Zwykłe tablice są słabe, praktycznie żadnego wsparcia dla tablic jako całego obiektu, dysponujemy jedynie wskaźnikiem. Klasa vector<T> daje dużo więcej.

0

@adf88 za bardzo kombinujesz, to jest dopiero początkujący!
@othello & @test30: lepiej dodać do funkcji dodatkowy argument oznaczający tablicę, w której ma być wynik, czyli:

int* nazwafunkcji ( int* tablica, int /* rozmiar */ ) 
{
    tablica[0] = 3;
    tablica[1] = 4;
    return tablica;
}

// przykładowe użycie
int tablica[34];
nazwafunkcji ( tablica, 34 );
0

dzieki za pomoc,
rozwiazalem to przy pomocy wskaznika

           long int m[4];
          long int *stan() {
               long int *wm; // wskaznik m
               wm=m;
               return wm;}

MarekR22, akurat zalezy mi na tym, zebym wiedzial jak zwrocic tablice(albo jej adres), to juz taki prawie sentyment, teraz juz wiem, ale bardzo dobrze, ze nawet te najprostrze rozwiazania pokazujesz mi, moze akurat byloby ono dla mnie wystarczajace, a przeoczyl byl je :D

teraz mam kolejny problem,
powiedzcie mi, czy mozna przypisac bez petli jedna tablice drugiej, tzn:
int tab[2];
int kop[2];
tab[0]=1;
tab[1]=2;
kop=tab;
i oczekiwany przezmnie efekt to
kop={1,2};

kompilator zwraca mi bledy, ktore rozumiem, ale przeciez to, czego nie mozna znaleŹĆ w ksiazce, nie zawsze musi nie istniec

kod tego, na czym eksperymentowalem

#include <iostream>
using namespace std;
int main () {
 int tab[2];//tablica pierwotna
 tab[0]=10;
 tab[1]=20;
 int *wsk;
 wsk=&tab[0];
 cout<<"oryg";
 std::cout<<wsk<<"="<<*wsk++<<std::endl;
 std::cout<<wsk<<"="<<*wsk++<<std::endl;
 int kop[2];
 
 //kop=tab; //ISO C++ forbids assignment of arrays 
 
 kop=*wsk; // chodzi o to zeby tablicy kop[] przypisac cala tablice tab[]
 
 cout<<"kopia";
 std::cout<<"kop[0]"<<"="<<kop[0]<<std::endl;
 std::cout<<"kop[1]"<<"="<<kop[1]<<std::endl;
 system("PAUSE");
}
0
test30 napisał(a)

teraz mam kolejny problem,
powiedzcie mi, czy mozna przypisac bez petli jedna tablice drugiej, tzn:

funkcja memcpy http://www.cplusplus.com/reference/clibrary/cstring/memcpy.html
w C/C++ musisz nauczyć się traktować tablice jak fragment pamięci

0
crayze napisał(a)

funkcja memcpy
no dramat :-/ użyj vector, jest prostszy i bezpieczniejszy:

#include <vector>

vector<int> tab(2), kop;
tab[0]=1;
tab[1]=2;
kop = tab;

Przy pomocy vectora możemy traktować całą tablicę jak jedną zmienną.

test30 napisał(a)

long int m[4];
long int *stan() {
long int *wm; // wskaznik m
wm=m;
return wm;}
Twoja funkcja nie robi nic oprócz zwracania wskaźnika na pierwszy element tablicy m.
Zamiast pisać "long int *p = stan();" wystarczy przecież "long int *p = m;".

0
MarekR22 napisał(a)

@othello & @test30: lepiej dodać do funkcji dodatkowy argument oznaczający tablicę,

To wiem. Zreszta bardzo rzadko uzywam tablic (zamiast tego vector), podobnie bardzo rzadko używam char* (zamiast tego string) itd...

adf88 napisał(a)

Tylko warning ? Dziwne.

Hmm dobre i to.. mam wrazenie, ze Borland nawet warninga nie wyswietla.

0

adf88 ale chłopak się uczy podstaw, najpierw niech zrozumie jak pracuje się czystych na tablicach,
a dopiero później używa kontenerów, aby mógł zrozumieć jak działa taki kontener...

zdobywanie wiedzy progresywnie uważam za lepszy sposób na naukę...

0

Mimo wszystko zacząłbym od poznania vector'a i od początku przyzwyczajania się do pojęcia obiektu. Wskaźniki i manualne zarządzanie pamięcią zostawiłbym na dokładkę, jak np. na dokładkę można się zaznajomić z assemblerem, ta sama bajka. Przy dzisiejszych technologiach wskaźnik to rozwiązanie profesjonalne do specyficznych przypadków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1