🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #60125

Re: Jak zrobić program obliczający dużą silnię?

#60125
From: Maciej Sobczak
Date: Thu, 27 Oct 2005 08:41
57 lines
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!news
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>

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