• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zwracanie tablicy z funkcji.

VPS Starter Arubacloud
0 głosów
1,736 wizyt
pytanie zadane 26 listopada 2020 w C i C++ przez mik53r Nowicjusz (150 p.)

Hej, mam problem ze zwracaniem tablicy z funkcji. Funkcja losuje liczby bez powtórzeń i zapisuje je w tablicy, następnie taką tablicę chcę zwrócić z funkcji. Nie do końca ogarniam jak to zrobić.

Kod wygląda następująco: 

#include <iostream>
#include <ctime>

int losowanie(int ile_losow, int zakres)
{
    
int* tab = new int [ile_losow+1];
bool sprawdzenie;
int ile=0;
int n;

for(int i=1; i<=ile_losow; i++)
{
    
    do
    {
        int liczba=(rand()%zakres)+1;
        sprawdzenie=true;

        for(int j=1; j<=ile_losow; j++)
        {
            if(liczba==tab[j])
            {
                sprawdzenie=false;
            }
        }
        if(sprawdzenie==true)
        {
            ile++;
            tab[ile]=liczba;

        }
    }while(sprawdzenie!=true);
}
// sprawdzenie, czy funkcja poprawnie losuje liczby 
/*
for(int k=1; k<=ile_losow; k++)
     {
         std::cout<<tab[k]<<std::endl;
     }
*/

return tab[2];
}

int main() 
{
srand(time(NULL));





return 0;
}

Moim zamiarem było wykorzystanie funkcji do wygenerowania  tablic liczb losowych, a następnie chciałem wykorzystać tą tablice w dalszej części programu, do wypisania jej forem na ekran i wyznaczenia wartości maksymalnej. W momencie gdy chcę zwrócić tablice w funkcji wyskakuje błąd. Domyślam się, że jest to spowodowane wykorzystaniem wskaźników, niestety teorię staram się nadrabiać jak najszybciej, ale musiałem nagle wskoczyć w C++ i jeszcze nie do końca wszystko ogarniam. 

Z góry, dziękuję za pochylenie się nad tematem. 

1 odpowiedź

+2 głosów
odpowiedź 26 listopada 2020 przez tangarr Mędrzec (154,780 p.)
wybrane 26 listopada 2020 przez mik53r
 
Najlepsza

Zwracasz jedną liczbę zamiast tablicy;

int * stworz_tablice(int rozmiar) {
    int *tablica = new int [rozmiar];
    return tablica;
}

Kilka uwag:
- dlaczego tworzysz tablicę o 1 większą?
- dlaczego iterujesz po tablicy od indeksu 1? Tablice w C++ są indeksowane od zera.
- pętla do {} while jest bez sensu - iterujesz po niezainicjowanych elementach. Przemyśl ją ponownie

komentarz 26 listopada 2020 przez mik53r Nowicjusz (150 p.)

Dzięki, kod się już kompiluje i funkcja zwraca tablice. Teraz mam pytanie, jak ją poprawnie wyświetlić. 

int* losowanie(int ile_losow, int zakres)
{
    
int* tab = new int [ile_losow];
bool sprawdzenie;
int ile=0; //zmienna pomocnicza umozliwajaca porownanie czy liczby sie nie powtorzyly 


for(int i=1; i<=ile_losow; i++) // petla ktora okresla ilosc losowanych liczb
{
    
    do //petla losujaca liczbe
    {
        int liczba=(rand()%zakres)+1; //losowanie
        sprawdzenie=true;

        for(int j=1; j<=ile_losow; j++) //petla sprawdzajaca czy wylosowana liczba sie nie powtarza
        {
            if(liczba==tab[j])
            {
                sprawdzenie=false; //jesli sie powtarza mamy FALSE i losujemy nastepna liczbe
            }
        }
        if(sprawdzenie==true) //warunek ktory zapisuje wylosowana liczbe do tablicy (jesli sie nie powtarza)
        {
            ile++;
            tab[ile]=liczba;

        }
    }while(sprawdzenie!=true); //do-while trwa do momentu gdy niepowtorzona liczba zapisze sie do tablicy, po czym wracamy do fora i tak "ile_losow"
}
// sprawdzenie, czy funkcja poprawnie losuje liczby 
/*
for(int k=1; k<=ile_losow; k++)
     {
         std::cout<<tab[k]<<std::endl;
     }
*/

return tab;
}

int main() 
{
srand(time(NULL));
int tab[4];

for(int i=1; i<=5; i++)
{
    tab[i]=*losowanie(5,5); // kompilator dopuszcza tylko taki zapis z gwiazdka ale w tym momencie na ekran zostają wyświetlone same zera
    std::cout<<tab[i]<<std::endl;
}


return 0;
}

W momencie gdy, próbuje w taki sposób wyświetlić tablice, program wypisuje same zera. 

komentarz 26 listopada 2020 przez tangarr Mędrzec (154,780 p.)

Nie można przypisać wskaźnika do tablicy (ani tablicy do tablicy).

int *tab = losowanie(5,5);
for (int i=0; i<5; i++) {
   cout << tab[i] << " ";
}

// na koniec programu/zasięgu zmiennej
delete [] tab;

Ponadto zupełnie olałeś to co ci napisałem o indeksowaniu tablicy.
Tablica składająca się X elementów jest indeksowana od 0 do X-1.

komentarz 26 listopada 2020 przez mik53r Nowicjusz (150 p.)
Wielkie dzięki za pomoc, ewidentnie brakuje mi jeszcze zaplecza teoretycznego i bardzo mi pomogłeś. Wskazówki odnośnie indeksowania tablicy nie olałem, wiem że indeksuje się od 0 do n-1, ale w moim przypadku nie mogę w ten sposób zapisać pętli, gdyż kod zostaje podany do programu symulacyjnego, który nie przyjmuje takiego indeksowania i powoduje to duże komplikacje, stąd niejako mam odgórnie narzucone takie indeksowanie.

Jeszcze raz wielkie dzięki za szybką i rzetelną pomoc.

Podobne pytania

0 głosów
1 odpowiedź 559 wizyt
pytanie zadane 25 kwietnia 2020 w C i C++ przez Anahan89 Obywatel (1,270 p.)
0 głosów
2 odpowiedzi 3,677 wizyt
pytanie zadane 17 listopada 2016 w C i C++ przez intensick Początkujący (420 p.)
0 głosów
3 odpowiedzi 543 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...