Article View: pl.comp.os.linux.programowanie
Article #60125Re: Jak zrobić program obliczający dużą silnię?
From: Maciej Sobczak
Date: Thu, 27 Oct 2005 08:41
Date: Thu, 27 Oct 2005 08:41
57 lines
3651 bytes
3651 bytes
Marcin 'Qrczak' Kowalczyk wrote:
> Dla mnie to jest naturalny sposób przerwania dowolnej
> kombinacji zagnieżdżonych pętli, bo jest niezależny od sposobu
> implementacji pętli
Do bani.
Problem w tym, że wyjątek rzucony wewnątrz pętli nie ma żadnego związku
z tym, co przerywa. Tylko pewna konwencja (w sensie względnego położenia
throw oraz bloków try/catch czy ich odpowiednika) może zapewnić (?), że
przerwiesz dokładnie te pętle, które faktycznie chcesz - to jest słabe i
widać to np. przy przenoszeniu/kopiowaniu kodu w inne miejsce programu.
Po prostu miejsce rzucenia wyjątku i miejsce jego łapania nie mają
*żadnego* związku z pętlami ani tym bardziej z ich kombinacją. Dokładnie
to samo co goto, tyle że bez użycia słowa "goto". A nawet gorzej, bo
przeniesienie kodu z goto w inne miejsce programu spowoduje błąd
kompilacji, jeśli nie przeniesz tego razem z właściwą etykietą docelową,
natomiast pętla z rzuceniem wyjątku takiego "ograniczenia" nie ma:
try
{
for (...)
for (...)
for (...)
{
if (something)
throw loop_breaker();
}
}
catch (loop_breaker const &) {}
Co się stanie jeśli przeniosę albo skopiuję dwie wewnętrzne pętle gdzie
indziej? Gdzie sobie ten wyjątek poleci?
Najlepsze rozwiązanie jakie do tej pory widziałem to etykiety pętli. W
C/C++ mogłoby to wyglądać tak:
outermost_loop:
for (...)
for (...)
for (...)
{
if (something)
break outermost_loop; // <-
}
Od goto (i wyjątków) różni się tym, że instrukcja przerywająca i
przerywana pętla są ze sobą ściśle związane. Nie da się po prostu
przesunąć etykiety "outermost_loop" w inne miejsce (np. dalej od pętli),
bo to natychmiast spowoduje błąd kompilacji.
Od wyjątków różni się dodatkowo tym, że nie można tego schować w funkcji
wywołanej w pętli, ale akurat nie uważam tego za wadę.
--
Maciej Sobczak : http://www.msobczak.com/
Programming : http://www.msobczak.com/prog/
Technical Details
Message-ID:
<djq3rj$4fm$1@sunnews.cern.ch>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!news.germany.com!solnet.ch!solnet.ch!news-zh.switch.ch!switch.ch!cernne03.cern.ch!cern.ch!newsReferences:
<djfrn5$i55$1@nemesis.news.tpi.pl> <dji80k$2a5$2@atlantis.news.tpi.pl> <20051024135514.GA237@siebert> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <e2pcznjzv2gh$.1drgaxj9rqzhj.dlg@40tude.net> <djnjtf$suk$2@nemesis.news.tpi.pl> <1i7bbr8l84m9o$.8ttxld9ccdq4.dlg@40tude.net> <djnq5h$8ae$1@atlantis.news.tpi.pl> <gmqro8ttahov.aorv2e8thz25.dlg@40tude.net> <87wtk0iiqw.fsf@qrnik.zagroda>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!news.germany.com!solnet.ch!solnet.ch!news-zh.switch.ch!switch.ch!cernne03.cern.ch!cern.ch!news From: Maciej Sobczak <no.spam@no.spam.com> Newsgroups: pl.comp.os.linux.programowanie Subject: Re: Jak zrobić program obliczający dużą silnię? Date: Thu, 27 Oct 2005 10:41:24 +0200 Organization: CERN - European Laboratory for Particle Physics Lines: 57 Message-ID: <djq3rj$4fm$1@sunnews.cern.ch> References: <djfrn5$i55$1@nemesis.news.tpi.pl> <dji80k$2a5$2@atlantis.news.tpi.pl> <20051024135514.GA237@siebert> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <e2pcznjzv2gh$.1drgaxj9rqzhj.dlg@40tude.net> <djnjtf$suk$2@nemesis.news.tpi.pl> <1i7bbr8l84m9o$.8ttxld9ccdq4.dlg@40tude.net> <djnq5h$8ae$1@atlantis.news.tpi.pl> <gmqro8ttahov.aorv2e8thz25.dlg@40tude.net> <87wtk0iiqw.fsf@qrnik.zagroda> NNTP-Posting-Host: abpc10883.cern.ch Mime-Version: 1.0 X-Trace: sunnews.cern.ch 1130402483 4598 (None) 137.138.37.241 X-Complaints-To: news@sunnews.cern.ch User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050922 Red Hat/1.7.12-1.1.3.2.SL3 X-Accept-Language: en-us, en In-Reply-To: <87wtk0iiqw.fsf@qrnik.zagroda> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit