wyjątki od wyjątków?

0

Witam i mam problem ;) [troche przydługie, ale absurdalnie śmieszne]

Czy istnieje mozliwosć że w kodzie zawartym w try wystąpi błąd, a nie
nastąpi odwołanie do catch (bo mnie się tak dzieje - chociaż sam juz nie
wiem do końca co).

Taki oto kodzik:
<font color="blue">/---------------------------------------------------------------------------
delete[] tab; //na początku jest na null, więc można
tab = NULL;

try {
tab = new int[(do_ilu-od_ilu)+1];
}

catch(...) {
status->Caption="BŁĄD";
blad=1;
}

if (tab==NULL) {
blad=1;
status->Caption="BŁĄD";
}
/---------------------------------------------------------------------------
</span>
Dla danych: od_ilu=100 000, do_ilu=10 000 000 tablica się tworzy i wszyćko
działa
Dla: od_ilu=100 000, do_ilu=100 000 000 brakuje pamięci,
wykonuje
się catch i po kłopocie [i teraz będzie najlepsze]
Dla: od_ilu=100 000, do_ilu=1 000 000 000 oczywista sprawa jest że tez
brakuje pamięci, ale catch się nie wykonuje ;)
Program leci dalej - mija nawet ostateczną barierę if(tab==NULL) i daje
przeróżne błędy i inne syfy.

Może ktoś widzi w tym jakiś sens lub logikę??? - bo ja nie

W akcie depresji do try dodałem: tab[do_ilu-od_ilu]=0; co na szczęście ;);)
dało wyjątek i program się poskromił - ale w programowaniu chodzi o
zapobieganie błędom, a nie o celowe stwarzanie dodatkowych okazji do ich
wystąpienia - na czym to właśnie polegał mój akt desperacji ;).

Tak więc szukam pomysłu na rozwiązanie tego problemu, a swoje już
wyczerpałem z efektami powyższymi...:]

PS: A wywalił wam kiedyś kompilator podczas kompilacji acces violation - bo
ja go przed chwilą do tego doprowadziłem moim cudownym programem ;)

Pozdrawiam

0

delete[] tab;

po co piszesz coś takiego , nigdy sie z czymś takim nie spotkałem i wydaje mi sie te bez sensu , ale kto wie ... W sumie cały czas sie ucze ...
A co do new i tego dziwnego wyjątku , to po pierwsze po co ci tak ogromne tablice , weź pod uwage to , że komp musi przyznaczyć na to ciągłą pamięć , lepiej już zrobić to na listach , lub czymś innym . Po drugie być może liczba jaką podajesz argumentowi new ( tab=new int[liczba] ) może musi być mniejsza od 900000000 , nie wiem , w helpie nic nie ma , ale może sie okazać , że np argument jest za duży , licznik się przekręca itp . Po prostu nie znamy za dobrze tego jak dokładnie działają te funkcje , może sie okazać , że jest to po prostu ograniczenie tego operatora , a nie zrobili do tego obsługi wyjątków . Albo po prostu błąd w samym kompilatorze.

0

delete[] tab;

po co piszesz coś takiego , nigdy sie z czymś takim nie spotkałem i wydaje mi sie te bez sensu , ale kto wie ... W sumie cały czas sie ucze ...

Co Ci nie pasuje z tym kasowaniem? Jest jak najbardziej poprawne i zalecane. Kasujesz tablicę, a nie jeden element.

0

oczywiscie , jak wczesniej sie rezerwowalo pamiec do tego wskaźnika to jest to NIEZBĘDNE jak chcemy zwolnić tą pamięć . Ale nie o to mi chodziło , ssman napisał :

delete[] tab; //na początku jest na null, więc można

po co kasować skoro na początku jest NULL ???
wcześniej przeciez nic do tego nie przypisywał , żadnego adresu , nie alokował pamięci , więc po co ta linijka ??

//W takim razie zwracam honor - potwierdzam, że w tym przypadku to nie ma sensu - nie zrozumiałem Cię - m.M

0

Sprawdzałem twój kod (BCB), ale musiałem pomnożyć wartości przez 1000, aby zabrakło miejsca. U mnie działa to bez problemów. Może wyda ci się to trochę dziwne, ale sprawdź, czy gdzieś nie zapisujesz do tablicy poza zakres. Miałem taki przypadek w BorlandC i błąd ujawiniał się w miejscu, gdzie nie było w ogóle związu z powodem błędu.
A... i jeszcze podaj jak deklarujesz poszczególne zmienne. Może tam gdzieś jest błąd.

0

<font size="12">-></span><font color="red">oczywiscie , jak wczesniej sie rezerwowalo pamiec do tego wskaźnika to jest to NIEZBĘDNE jak chcemy zwolnić tą pamięć . Ale nie o to mi chodziło , ssman napisał :
delete[] tab; //na początku jest na null, więc można
po co kasować skoro na początku jest NULL ???
wcześniej przeciez nic do tego nie przypisywał , żadnego adresu , nie alokował pamięci , więc po co ta linijka ?? </span>

Ten kod może być wykonywany wielokrotnie - za pierwszym razem rzeczywiście kasowanie nic nie daje (a wskaźnik jest na null, coby windowsa z pamięci nie wywaliło przypadkiem :-D ), ale już za 2 byłaby strata pamięci - duża przy tablicy 100000000.............
+++++++++++++++++++++++++++++++++++++++++++
Potrzebne mi jak największe, mozliwe do osiagnięcia na danym kompie tablice, bo musze pracować na takich wielkich przedziałach...... :-) :-) :-)

========
Pozdrawiam

[<font color="blue">post2</span>]
<font color="red">musiałem pomnożyć wartości przez 1000, aby zabrakło miejsca</span>

ja mam 64 ramy i 200 na swapie - to dla tego

<font color="red">sprawdź, czy gdzieś nie zapisujesz do tablicy poza zakres</span>

Wcześniej jest tworzona inna, malutka tabliczka - tam wszystko sprawdziłem 10x i jest cacy...

<font color="red">A... i jeszcze podaj jak deklarujesz poszczególne zmienne. Może tam gdzieś jest błąd.</span>

Tabliczki - to najpierw globalne wskaźniki - potem lokalnie dostają adresy.
Reszta zmiennych to globalne int'y

Podczas tego dziwacznego błędu zmienna blad nie zmienia wartości na 1 (wiec program idzie dalej). Następuje proba zapisania nieistniejącej tablicy i program się wywala raz to przy 3, raz przy 5 elemencie - zależnie gdzie trafi [hurra]

//Edycja postów!! - m.M

0

Nie mam pojęcia co jest nie tak, ale na pewno nie jest to błąd kompilatora. Najlepiej zrób to po staremu: malloc :) Wtedy nie będziesz potrzebował wyjątków.

0

Dzięki wszystkim za wszystkie odpowiedzi.........

[browar]
Pozdrawiam

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