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

Znajdowanie palindromu i błąd "program przestał działać"
R9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
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.

Kopiuj
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;
}

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

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

Zamiast

Kopiuj
int tab[1000000];
Kopiuj
std::vector<int> tab(1000000);
R9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
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

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

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

R9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Dokładnie tak wygląda.

Software
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 174
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ę:

Kopiuj
int tab[1000000];

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

Kopiuj
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

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.