Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Przepełnienie stosu

Ostatnio zmodyfikowano 2017-12-26 19:56
Autor Wiadomość
grzeso
Temat założony przez niniejszego użytkownika
[c++] Przepełnienie stosu
» 2017-12-25 17:02:21
Witam

mam taki kawałeczek kodu

C/C++
#include <iostream>

using namespace std;

class Lotto
{
    int wylosowana[ 6 ];
};


int main()
{
    int liczbaZakladow = 0;
   
    cout << "Podaj ilosc zakladow" << endl;
    cin >> liczbaZakladow;
   
    Lotto L[ liczbaZakladow ]; //<< MIEJSCE 1
    for( int numerZakladu = 0; numerZakladu <= liczbaZakladow; numerZakladu++ )
    {
        //Lotto L[numerZakladu]; //<< MIEJSCE 2
        cout << numerZakladu << endl;
    }
   
    return 0;
}

Ten kod to mocno uproszczony kod programiku do Lotto który sobie piszę.

Chce stworzyć milion (albo i kilka milionów) klas Lotto, w każdej klasie ma być 6 wylosowanych liczb.

Mój problem polega na tym że jak w MIEJSCU 1 dam tworzenie klas, i tych klas jest milion to program wywala błąd.
Jak w MIEJSCU 2 dam tworzenie klas to przy 90 tysiącach stworzonych wywala błąd.

Jeśli wywalę wiersz:
int wylosowana[ 6 ];
 i klasa będzie się tworzyć ale bez niczgo w środku to wywala mi się program przy 6 milionach klas.

Błąd:

Process returned -1073741571 (0xC00000FD)

Z tego co szukałem chodzi o przepełnienie stosu, próbowałem z destruktorem coś, ale bez skutku.


Ma ktoś jakiś pomysł na rozwiązanie problemu.
Gdzieś w internetach znalazłem że może chodzić o ustawienia Code::Blocks
P-168110
killjoy
» 2017-12-25 17:22:41
Tak się nie robi tablic dynamicznych, ponadto ten kod jest niepoprawny. Użyj std::vector, albo stwórz dynamiczną tablicę przy pomocy operatora new.
C/C++
int liczbaZakladow = 0;

cout << "Podaj ilosc zakladow" << endl;
cin >> liczbaZakladow;

Lotto L[ liczbaZakladow ];


Przepełnienie stosu dostajesz, gdyż cała ta tablica jest tworzona na stosie, a on ma ograniczoną wielkość - stosunkowo małą w porównaniu do dynamicznej alokacji, przez co kończy się na nim miejsce przy kilku milionach klas.

P-168111
grzeso
Temat założony przez niniejszego użytkownika
» 2017-12-25 18:51:24
C/C++
#include <iostream>

using namespace std;

class Lotto
{
public:
    int wylosowana[ 6 ];
   
   
    void proceduraLosowania()
    {
        cout << "aa" << endl;
    }
};


int main()
{
    int liczbaZakladow = 0;
   
    cout << "Podaj ilosc zakladow" << endl;
    cin >> liczbaZakladow;
   
   
    Lotto * Zaklad = new Lotto[ liczbaZakladow ];
   
    for( int numerZakladu = 1; numerZakladu <= liczbaZakladow; numerZakladu++ )
    {
       
        Zaklad[ numerZakladu ].proceduraLosowania();
        cout << numerZakladu << endl;
    }
   
    return 0;
}

A co myślisz o takim kodzie?

funkcja
proceduraLosowania()
 jest tylko dla sprawdzenia
P-168115
mateczek
» 2017-12-26 19:56:16
1. tablice indeksujesz od zera
for( int i = 0; i < rozmiar; i++ )

2. jest "new" musi być "delete", lub wskaźniki inteligentne, lub jakiś kontener np  "std::vector"
P-168133
« 1 »
  Strona 1 z 1