zwracanie adresu zmiennej/wskaznik

0

Witam, mam pewne pytanie - problem ze zwracaniem adresu początku tablicy, nie wiem czy robię to poprawnie a chciałbym się upewnić bądź poznać lepszy sposób na rozwiązanie mojego problemu.

A wiec do dzieła, w funkcji main mam taka funkcje

int Funkcja(int *wskaznik, int rozmiar)
{
   int tablica[rozmiar];
   ...
   return(*tablica);
}

Natomiast w funkcji main mam taki oto fragment

main()
{
   int zmienna, *wsk;
   ...
   zmienna = Funkcja(wsk_do_tab_los, rozmiar);
   wsk = &zmienna;
}

Chciałbym aby Funkcja zwracała adres do pierwszego elementu tablicy w Funkcji, aby później móc go zapisać we wskaźniku, czy taka konstrukcja jak powyżej jest dobra? czy ktoś zna lepszy sposób?

Próbowałem coś takiego:

int Funkcja(int *wskaznik, int rozmiar)
{
   int tablica[rozmiar];
   ...
   wskaznik = tablica;
   return(wskaznik);
}

Natomiast w funkcji main

main()
{
   int zmienna, *wsk;
   ...
   wsk = Funkcja(wsk_do_tab_los, rozmiar);
}

Jednak niestety nie działa, a nie za bardzo rozumiem dlaczego, może ktoś mógłby przybliżyć problem?
Lepiej przypomnieć lekcję o wskaźnikach czy o funkcjach?

Z góry dziękuje.
Eldiane

0

Obie wersje są błędne i to bardzo błędne. Zdecydowanie musisz sobie przypomnieć o funkcjach, wskaźnikach, dynamicznej alokacji pamięci i zakresie obowiązywania zmiennych.
Nie dość, że próbujesz zwrócić wskaźnik do int jako int, to jeszcze zwracasz tablicę utworzoną na stosie, która po wyjściu z funkcji przestaje istnieć.
To przypisanie wskaznik = tablica też tu nie ma sensu, bo pracujesz na kopii wskaźnika, a nie jego oryginale(lekcja na dziś - przekazywanie argumentów do funkcji).

Teraz pytanie: o jakim języku rozmawiamy? Kolorowanie składni wybrałeś dla C++, ale korzystasz z pewnych specyficznych rzeczy dla C:
-domyślny typ zwracanej wartości przez funkcję w definicji funkcji main - w C domyślnym typem jest int, C++ nie dopuszcza czegoś takiego jak domyślny typ funkcji
-int tablica[rozmiar]; - tu korzystasz z VLA - normalne w C, ale jeżeli chodzi o C++ to jest rozszerzenie kompilatora i nie każdy to obsługuje(np. CLang na to nie pozwala - kompilator w Visual C++).

W C++ to powinno wyglądać tak:

int* Funkcja1(int rozmiar)
{
    int* tablica = new int[rozmiar]; //alokacja pamięci na stercie
    ...
    return tablica;
}

void Funkcja2(int *& tablica, int rozmiar) //tablica jest referencją do wskaźnika do int
{
    tablica = new int[rozmiar];
    ...
}

int main()
{
    int* tab;

    tab = Funkcja1(10);
    //lub
    Funkcja2(tab, 10);
    ...
    delete [] tab; //konieczne zwolnienie zaalokowanej pamięci, w przeciwnym wypadku będziesz miał wycieki

    return 0; //nie konieczne, bo domyślnie main zwraca 0, ale dobrze napisać
}
0

Dzięki za odpowiedź, a szczególnie za tą część:

byku_guzio napisał(a):

Obie wersje są błędne i to bardzo błędne. Zdecydowanie musisz sobie przypomnieć o funkcjach, wskaźnikach, dynamicznej alokacji pamięci i zakresie obowiązywania zmiennych.
Nie dość, że próbujesz zwrócić wskaźnik do int jako int, to jeszcze zwracasz tablicę utworzoną na stosie, która po wyjściu z funkcji przestaje istnieć.
To przypisanie wskaznik = tablica też tu nie ma sensu, bo pracujesz na kopii wskaźnika, a nie jego oryginale(lekcja na dziś - przekazywanie argumentów do funkcji).

Teraz pytanie: o jakim języku rozmawiamy? Kolorowanie składni wybrałeś dla C++, ale korzystasz z pewnych specyficznych rzeczy dla C:
-domyślny typ zwracanej wartości przez funkcję w definicji funkcji main - w C domyślnym typem jest int, C++ nie dopuszcza czegoś takiego jak domyślny typ funkcji
-int tablica[rozmiar]; - tu korzystasz z VLA - normalne w C, ale jeżeli chodzi o C++ to jest rozszerzenie kompilatora i nie każdy to obsługuje(np. CLang na to nie pozwala - kompilator w Visual C++).

Wezmę sobie to do serca, chciałbym trochę pobawić się w C++, przeczytałem parę książek, ale cóż wiedza teoretyczna a praktyczna to dwa inne światy, teraz próbuję to co "niby się nauczyłem", biorę się do roboty i zaczynam przypominać sobie zakres tematyczny który podałeś/aś :)

Z góry dziękuję.
Eldiane.

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