Funkcja zwracająca tablicę

0

Jak w tytule, stworzyłem taki kod(niestety musiałem użyć tablicy do tego - takie zadanie)
Funkcja:

 
int * DecToBin(int *tab, int number, int size)
{
     int p=0;
     for(int i=size;i>0;i--)
     {
             p=number%2;
             tab[i]=number%2;
             number/=2;
             //printf("tab - %d\n",tab[i]);
     }
     int* tab2=tab;
     return tab2;
}

Wywołanie

 
    int* tab2=DecToBin(tab, n2, tSize);

To już któraś wersja - googluje i zastanawiam się jak to zwracać, nie jest to szczególnie ładne, ale po prostu coś chciałem wykombinować jak to zrobić? ;)

0

Ty w tej chwili zwracasz tą tablice, którą przekazujesz w parametrach funkcji. Po wyjściu z funkcji posiadasz dwie takie same tablice (bo operacje, które przeprowadzasz we funkcji na tablicy przekazanej jako argument są widoczne również poza tą funkcją). Poza tym tablice indeksuje się "od 0 do size - 1", a nie od "1 do size" jak to napisałeś w programie.

0

Chcesz zwrócić nową tablicę tak? Czy zapisać do starej? Jak do nowej to zmień parametr na stały, a do nowej tablicy przepisuj starą z nowymi wynikami, na końcu ją zwróć.

int* DecToBin(const int* tab, int number, int size)
{
     int p = 0;
     int* newTab = new int[size];
     for(int i = size; i > 0; i--)
     {
             p = number % 2;
             newTab[i] = number % 2;
             number /= 2;
             // printf("tab - %d\n", tab[i]);
     }
     return newTab;
}

// ...

int* outTab = DecToBin(...);

Tak jak robisz to tylko przypisujesz adres starej do nowej.

0

Jak to jest C++, to proponuje pobawić się w zwracanie vector<bool> albo po prostu string-a

0

Ale jaka jest teść zadania?Bo kod który pokazałeś nic sensownego nie robi ani nie pozwala wydumać,co dokładnie miałby robić

0

Treść zadanka? Mam napisać program który w funkcji przelicza mi liczbę z systemu dziesiętnego na binarny (czyli w zasadzie cały kod podałem ;) ), problem w tym że moje nauczycielka (przynajmniej w mojej opinii) nie ma pojęcia o tym czego uczy, tzn kazała zapisać tą liczbę w kolejnych miejscach w tablicy(koniecznie do tablicy, dlatego też string czy vector odpadają, z reszta kod na stringu oddałem po kilku minutach i oczywiście nie został zaakceptowany, argumentowała to tym że uczy nas używania tablic, fajnie ale programowanie po 4h w tygodniu mam od 3 lat, tak wygląda nauka programowania w jednym z najlepszych techników w Polsce(perspektywy)). Z resztą na lekcji dała kod - coś co działało tylko i wyłącznie dla danego zakresu liczb(tzn ograniczenie co do długości tablicy), nie mam już siły na dyskusje z tą osobą więc po prostu to pisałem, problem w tym, że nie jestem w stanie zmotywować się do napisania takiego świństwa jakie nam podała.
Ale do rzeczy - chcę stworzyć funkcję w której faktycznie zapisuję kolejne cyfry liczby w systemie binarnym do tablicy, ale zależy mi na tym żeby nie tworzyć statycznie jakiejś tablicy globalnie tylko na stworzeniu w funkcji tablicy o dokładnie potrzebnym rozmiarze.

0

to już wyżej dostałeś kod (w c++) z funkcją zwracającą tablice. Tutaj masz przykład w C.

#define SIZE 10

int* foo(int size)
{
    int* tab = (int*) malloc(sizeof(*tab) * size);
    int i;
    for(i = 0; i < size; ++i)
        tab[i] = i;

    return tab;
}

int main()
{
    int* tab = foo(SIZE);

    int i;
    for(i = 0; i < SIZE; ++i)
        printf("%d ", tab[i]);

    free(tab);

    return 0;
}

Kod, który ty wrzuciłeś jest bezsensu i o tym już wiesz, a ponadto wychodzisz w nim poza zakres tablicy (o czym wspomniałem wyżej). Funkcja nie może zwracać tablicy (niestatycznie) utworzonej w swoim ciele ponieważ jest to tablica lokalna, która po opuszczeniu funkcji przestaje istnieć (pamięć rezerwowana przez nią jest zwalniana). Z tego powodu musisz zarezerwować pamięć osobiście i zwrócić wskaźnik. Robisz to przy pomocy malloc (c/c++) lub new(c++). Musisz również pamiętać o zwolnieniu tej pamięci.

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