Znajdowanie palindromu i błąd "program przestał działać"

0

Cześć,
Nie mogę znaleźć błędu w kodzie. Wyskakuje error:"Program przestał działać". Program ma służyć do znalezienia palindromu który jest iloczynem dwóch 3-cyfrowych liczb.

using namespace std;

int main()
{
    int a=0, l=0,k,x;
    for(int i=999;i>99;i--)
    {
        for(int j=999;j>99;j--)
        {
            int tab[1000000];
            k=i*j;
            x=k;
            if(k%10==0)

            {
                break;
            }

            while(k)
            {
                tab[a]=k%10;
                k/=10;
                a++;
            }

            for (int h=0; h<a; h++)
            {
               l=10*l+tab[h];
            }
            if(l==x)
            {
                cout<<x;
                break;
               
            }
            else if(l!=x)
            {
                a=0;
                l=0;
            }
        }
        
    }
    return 0;
}

0

Spróbuj użyć mniejszej tablicy (albo std::vector), aby nie alokować na stosie, bo to jest prawdopodobnie przyczyną.

Zamiast

int tab[1000000];
std::vector<int> tab(1000000);
0

Podmieniłem ten jeden wiersz na std::vector, ale nadal wyskakuje błąd. Może to błąd środowiska lub kompilatora? Moje środowisko to Code Blocks

0

Ten sam błąd? Nie mogę go zreprodukować https://wandbox.org/permlink/dn1AdoBMOOhw19zy

0

Dokładnie tak wygląda.

0

Nie pamiętam ile maksymalnie można wrzucić danych na stos, ale faktycznie ta tablica przekracza ten rozmiar, więc gdzie byś jej nie umieścił, to wysypie ci program, rozsądne rozwiązanie, jeżeli już bardzo chcesz używać takiej dużej tablicy (może warto pomyśleć, jak można by zoptymalizować program?), to wrzucenie tej tablicy od razu na stertę programu, czyli usuwasz tą linijkę:

int tab[1000000];

i gdzieś na początku funkcji mein dajesz takie coś:

int *tab=new int[1000000];

to wrzuci ci tą tablice na sterte zamiast na stos procesora, jedynie trzeba ją jeszcze usunąć (zmienne na stosie usuwają się same podczas zakończenia wywołania funkcji np., a dane ze sterty w c++ trzeba usuwać w przemyślany sposób)

czyli na końcu funkcji mein przed returnem dajesz

delete[] tab;

i w tym momencie dane ze sterty zostają usunięte,
jeszcze taka uwaga, że przy alokacji danych nie muszą być one ustawione wartością zerową, mogą tam się znaleźć losowe wartości.
przy każdym użyciu słowa "new" alokujesz pamięć, więc trzeba go używać rozsądnie.

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