Tablica dynamiczna przeniesiona między funkcjami

0

Witam, mam problem, ponieważ chciałbym w jednej funkcji wypełnić tablicę znakami losowymi, podając ile tych znaków będzie, a w drugiej funkcji wypisać tę tablicę, ale przy wypisywaniu jej crashuje mi program, zmienną "ile" przenosi dobrze, ale tablicę już nie

void wypelnienie(int *tab, int &ile)
{
    srand(time(NULL));
    system("CLS");
    cout<<"Iloma znakami chcesz wypełnić tablicę?"<<endl;
    cout<<"Ile = ";
    cin>>ile;
    tab = new int[ile];
    for (int i=0;i<ile;i++)
    {
        tab[i]=rand()%200-100;
    }
}

void wypisanie(int *tab, int &ile)
{
    system("CLS");
    if (ile>0)
    {
    cout<<"Tablica z zakresu (-100;100):"<<endl;
    for (int i=0;i<ile;i++)
        cout<<tab[i]<<"\t";
    cout<<endl<<endl;
    system("pause");
    }
}
1
  • Jak wygląda main?
  • Skoro to C++ , to dlaczego nie używasz vector'a? Musisz używać surowych wskaźników z C?
0

To jest cały kod programu, dominanta nie jest zrobiona, vectora nie znam w sumie za bardzo, pisałem tak jak umiałem i kiedyś mi działały te tablice i tablicę muszę przekazywać między funkcjami, nie mogę zrobić globalnej, bo z globalną wszystko działa, ale takie zadanie mam.

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <windows.h>
using namespace std;

void wypelnienie(int *tab, int &ile)
{
    srand(time(NULL));
    system("CLS");
    cout<<"Iloma znakami chcesz wypełnić tablicę?"<<endl;
    cout<<"Ile = ";
    cin>>ile;
    tab = new int[ile];
    for (int i=0;i<ile;i++)
    {
        tab[i]=rand()%200-100;
    }
    cout<<tab[0];
    system("pause");
}

void wypisanie(int *tab, int &ile)
{
    system("CLS");
    system("pause");
    if (ile>0)
    {
    cout<<"Tablica z zakresu (-100;100):"<<endl;
    for (int i=0;i<ile;i++)
        cout<<tab[i]<<"\t";
    cout<<endl<<endl;
    system("pause");
    }
}

void dominanta(int *tab, int &ile)
{
    int dom, bufordom, iledom, buforiledom;
    system("CLS");
}

void wybor(int x, int *tab, int &ile)
{
    switch (x)
    {
    case 1:
        {
            wypelnienie(tab, ile);
            break;
        }
    case 2:
        {
            wypisanie(tab, ile);
            break;
        }
    case 3:
        {
            dominanta(tab, ile);
            break;
        }
    case 0:
        {
            system("CLS");
            cout<<"Wyjście z programu";
            Sleep(1000);
            break;
        }
    default:
        {
            system("CLS");
            cout<<"Brak takiej opcji";
            Sleep(1000);
            system("CLS");
            break;
        }
    }
}

void menu(int *tab, int &ile)
{
    int x;
    do
    {
        cout<<"Program do tworzenia tablicy"<<endl<<endl;
        cout<<"1. Wypełnienie tablicy "<<endl;
        cout<<"2. Wypisanie tablicy"<<endl;
        cout<<"3. Znalezienie dominanty"<<endl;
        cout<<"0. Wyjście"<<endl<<endl;
        cout<<"Twój wybór = ";
        cin>>x;
        wybor(x, tab, ile);
        system("CLS");
    } while (x!=0);
}

int main()
{
    int *tab, ile=0;
    setlocale(LC_ALL,"Polish");
    menu(tab, ile);
}

1

Tak jak kolega napisał. Najlepiej zapoznaj się z vectorem, który jest dużo wygodniejszy

#include <iostream>
#include <vector>
#include <cstdlib>
#include <time.h>
using namespace std;
vector<int> tab;
void wypelnienie()
{
    int a;

    cout<<"Iloma znakami chcesz wypelnic tablice: ";
    cin>>a;
    for(int i=0; i<a; i++ )
    {
        int liczba;
        liczba = rand()%200-100;
        tab.push_back(liczba);
    }

}

void wypisanie()
{
    for(int i=0; i < tab.size(); i++)
    {
        cout<<i+1<<". "<<tab[i]<<endl;
    }
}

int main()
{

    srand(time(NULL));
    wypelnienie();
    wypisanie();
}

Poczytaj o vectorach i spokojnie przeanalizuj kod.

0

Jeżeli zaś uparłeś się na wskaźniki oto twój kod w poprawnej wersji

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <windows.h>
using namespace std;

void wypelnienie(int *&tab, int &ile)
{
    system("CLS");
    cout<<"Iloma znakami chcesz wypełnić tablicę?"<<endl;
    cout<<"Ile = ";
    cin>>ile;
    tab = new int[ile];
    for (int i=0;i<ile;i++)
    {
        tab[i]=rand()%200-100;
    }


}

void wypisanie(int *&tab, int &ile)
{
    if (ile>0)
    {
    cout<<"Tablica z zakresu (-100;100):"<<endl;
    for (int i=0; i<ile; i++)
        cout<<tab[i]<<"\t";
        cout<<endl<<endl;
    system("pause");
    }
}

void dominanta(int *tab, int &ile)
{
    int dom, bufordom, iledom, buforiledom;
    system("CLS");
}
int main()
{
    int loop = 1;
    while(loop == 1)
    {
        srand(time(NULL));        
        int *tab, ile;
        setlocale(LC_ALL,"Polish");
        int x;
        cout<<"Program do tworzenia tablicy"<<endl<<endl;
        cout<<"1. Wypełnienie tablicy "<<endl;
        cout<<"2. Wypisanie tablicy"<<endl;
        cout<<"3. Znalezienie dominanty"<<endl;
        cout<<"0. Wyjście"<<endl<<endl;
        cout<<"Twój wybór = ";
        cin>>x;
        system("CLS");

        switch (x)
        {
        case 1:
        {
            wypelnienie(tab, ile);
            break;
        }
        case 2:
        {
            wypisanie(tab, ile);
            break;
        }
        case 3:
        {
            dominanta(tab, ile);
            break;
        }
        case 0:
        {
            system("CLS");
            cout<<"Wyjście z programu";
            Sleep(1000);
            break;
        }
        default:
        {
            system("CLS");
            cout<<"Brak takiej opcji";
            Sleep(1000);
            system("CLS");
            break;
        }
    }

    }

}

Nie twórz funkcji typu "menu" lub "wybor", ponieważ utrudniasz sobie tylko życie. Od tego masz int main, żeby zapisać czasem coś więcej niż wywołanie funkcji lub stworzenie zmiennych. Nie piszesz obszernego programy na 200000 linii, żebyś się w tym mainie zgubił. Dodatkowo nie wysyłałeś funkcji oryginałów tylko kopie (oryginały wysyłamy przez ampersand) więc nawet jeśli twój program by działał w tablicy były jakieś śmieci z pamięci.

0
Ma3stro napisał(a):

Jeżeli zaś uparłeś się na wskaźniki oto twój kod w poprawnej wersji

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <windows.h>
using namespace std;

void wypelnienie(int *&tab, int &ile)
{
    system("CLS");
    cout<<"Iloma znakami chcesz wypełnić tablicę?"<<endl;
    cout<<"Ile = ";
    cin>>ile;
    tab = new int[ile];
    for (int i=0;i<ile;i++)
    {
        tab[i]=rand()%200-100;
    }


}

void wypisanie(int *&tab, int &ile)
{
    if (ile>0)
    {
    cout<<"Tablica z zakresu (-100;100):"<<endl;
    for (int i=0; i<ile; i++)
        cout<<tab[i]<<"\t";
        cout<<endl<<endl;
    system("pause");
    }
}

void dominanta(int *tab, int &ile)
{
    int dom, bufordom, iledom, buforiledom;
    system("CLS");
}
int main()
{
    int loop = 1;
    while(loop == 1)
    {
        srand(time(NULL));        
        int *tab, ile;
        setlocale(LC_ALL,"Polish");
        int x;
        cout<<"Program do tworzenia tablicy"<<endl<<endl;
        cout<<"1. Wypełnienie tablicy "<<endl;
        cout<<"2. Wypisanie tablicy"<<endl;
        cout<<"3. Znalezienie dominanty"<<endl;
        cout<<"0. Wyjście"<<endl<<endl;
        cout<<"Twój wybór = ";
        cin>>x;
        system("CLS");

        switch (x)
        {
        case 1:
        {
            wypelnienie(tab, ile);
            break;
        }
        case 2:
        {
            wypisanie(tab, ile);
            break;
        }
        case 3:
        {
            dominanta(tab, ile);
            break;
        }
        case 0:
        {
            system("CLS");
            cout<<"Wyjście z programu";
            Sleep(1000);
            break;
        }
        default:
        {
            system("CLS");
            cout<<"Brak takiej opcji";
            Sleep(1000);
            system("CLS");
            break;
        }
    }

    }

}

Nie twórz funkcji typu "menu" lub "wybor", ponieważ utrudniasz sobie tylko życie. Od tego masz int main, żeby zapisać czasem coś więcej niż wywołanie funkcji lub stworzenie zmiennych. Nie piszesz obszernego programy na 200000 linii, żebyś się w tym mainie zgubił. Dodatkowo nie wysyłałeś funkcji oryginałów tylko kopie (oryginały wysyłamy przez ampersand) więc nawet jeśli twój program by działał w tablicy były jakieś śmieci z pamięci.

Dziękuję, ten vector działa super i bardzo ciekawy do tablic, będę musiał go poćwiczyć trochę, ale dziękuję też za wersję ze wskaźnikami.

0

@May2Bee: Czas poświęcony na naukę vector'ów (a będzie on krótki!) zwróci Ci się w ciągu -- szacuję grubo -- dwóch tygodni programowania, ale zapewne duuużo wcześniej. Polecam prezentację:
https://klmr.me/slides/modern-cpp/#1

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