Discussion:
Przerwanie dzialania petli
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
michalsky
2004-11-17 13:29:58 UTC
Permalink
Czesc.
Mam lamerski problem
mam przykladowo taką pętlę
while (i<255) do
begin
instr1;
instr2;
end;

i chcialbym dac uzytkonikowi możłiwość wyjscia z tej petli w dowolnym czasie
np prezy nacisnieciu przycisku Przerwij. Może podpowiecie jak rozwiązac taki
problem.
:tsogh:
2004-11-17 14:20:39 UTC
Permalink
Post by michalsky
Czesc.
Mam lamerski problem
mam przykladowo taką pętlę
while (i<255) do
begin
instr1;
instr2;
end;
i chcialbym dac uzytkonikowi możłiwość wyjscia z tej petli w dowolnym czasie
np prezy nacisnieciu przycisku Przerwij. Może podpowiecie jak rozwiązac taki
problem.
globalnie w var

var
b : boolean = false;

while (i<255) do
begin
if b = true then
begin
break;
end;
instr1;
instr2;
end;

procedure onButton1Clickde(sender......)
begin
b := true;
end;
:tsogh:
2004-11-17 14:21:57 UTC
Permalink
Post by :tsogh:
globalnie w var
var
b : boolean = false;
while (i<255) do
begin
aplication.processmessage(); <---- tu
Post by :tsogh:
if b = true then
begin
break;
end;
instr1;
instr2;
end;
procedure onButton1Clickde(sender......)
begin
b := true;
end;
mm
2004-11-22 18:32:44 UTC
Permalink
jeszcze mała uwaga
jeśli twoja procedura wymaga dużej szybkości to wywoływanie
application.processmessages może ją w pewnych sytuacjach bardzo
spowolnić, dlatego w takiej sytuacji należy skorzystać z gettickcount do
zliczania czasu i wywoływać application.processmessages tylko gdy minęłą
np jedna dziesiąta sekundy od ostatniego wywołania
application.processmessages
Jerzy Hołda | maszyna.pl
2004-11-17 16:56:13 UTC
Permalink
Post by michalsky
Czesc.
koniec : boolean;
...
while not koniec do
begin
// tutaj instrukcje
// jezeli chcemy przerwac to podstawiamy koniec := true;

koniec := koniec or (i >= 255);
//
end;



Pozdrawiam
Jerzy H
--
Jerzy Hołda | maszyna.pl
e-mail: jerz [ ] maszyna.pl | url: http://maszyna.pl
cell: +48 / 601-334-859 | gg: 900600 | jabber: jerz [ ] maszyna.pl
top_tp
2004-11-18 07:38:56 UTC
Permalink
Post by michalsky
Czesc.
Mam lamerski problem
mam przykladowo taką pętlę
while (i<255) do
begin
instr1;
instr2;
end;
i chcialbym dac uzytkonikowi możłiwość wyjscia z tej petli w dowolnym czasie
np prezy nacisnieciu przycisku Przerwij. Może podpowiecie jak rozwiązac taki
problem.
while (i<255) do
begin
instr1;
instr2;
Application.procesmessage;
if flaga then break;
end;

//gdzie wartosc flagi zmieniasz np. w jakims Butonie ( lub na klawiaturze -
ale tu musisz wiedziec jak wylapac nacisniecie klawisza
np. w Butonie:
procedure TFAnal.Button1Click(Sender: TObject);
begin
flaga := not flaga;
end;

/-/
michalsky
2004-11-18 09:02:28 UTC
Permalink
Post by michalsky
Post by michalsky
Czesc.
Mam lamerski problem
mam przykladowo taką pętlę
while (i<255) do
begin
instr1;
instr2;
end;
i chcialbym dac uzytkonikowi możłiwość wyjscia z tej petli w dowolnym czasie
np prezy nacisnieciu przycisku Przerwij. Może podpowiecie jak rozwiązac taki
problem.
while (i<255) do
begin
instr1;
instr2;
Application.procesmessage;
if flaga then break;
end;
//gdzie wartosc flagi zmieniasz np. w jakims Butonie ( lub na
klawiaturze -
Post by michalsky
ale tu musisz wiedziec jak wylapac nacisniecie klawisza
procedure TFAnal.Button1Click(Sender: TObject);
begin
flaga := not flaga;
end;
/-/
dzieki wszystkim za szybką reakcję. pozdro.
Michał Dyrała
2004-11-18 11:43:28 UTC
Permalink
Dnia Thu, 18 Nov 2004 08:38:56 +0100, top_tp napisał(a):
[...]roblem.
Post by michalsky
while (i<255) do
begin
instr1;
instr2;
Application.procesmessage;
if flaga then break;
end;
nie powiem, że to nie działa, ale trochę i taka mała dygresja, że z pętli
powinno być tylko JEDNO wyjście (kiedyś mi, i nie tylko mi zresztą to
profesor młotkiem tłumaczył i teraz tak mam :)), więc instrukcje typu
break, exit itp są niezbyt mile widziane, co nie oznacza, że czasem nie
można się bez nich obejść :). Można to tak zrobi poprawnie zmieniając jedną
linijkę:

while (i<255) do
begin
instr1;
instr2;
Application.procesmessage;
if flaga then
i := 255; // <- i w nastepnym przebiegu sam skończy pętle, bo warunek
będzie false
end;
--
Pozdrawiam Michał Misiekd Dyrała
Nikt nie jest doskonały
:tsogh:
2004-11-18 13:13:16 UTC
Permalink
, że to nie działa, ale trochę i taka mała dygresja, że z pętli
Post by Michał Dyrała
powinno być tylko JEDNO wyjście (kiedyś mi, i nie tylko mi zresztą to
profesor młotkiem tłumaczył i teraz tak mam :)), więc instrukcje typu
break, exit itp są niezbyt mile widziane, co nie oznacza, że czasem nie
można się bez nich obejść :). Można to tak zrobi poprawnie zmieniając jedną
dlaczego przeciez exit , break sa nieodzownymi skladniowymi whiel , for .....
moze chodziło ci o "goto" ???
Post by Michał Dyrała
while (i<255) do
begin
instr1;
instr2;
Application.procesmessage;
if flaga then
i := 255; // <- i w nastepnym przebiegu sam skończy pętle, bo warunek
będzie false
end;
--
Pozdrawiam Michał Misiekd Dyrała
Nikt nie jest doskonały
StoK
2004-11-18 13:46:59 UTC
Permalink
Post by Michał Dyrała
nie powiem, że to nie działa, ale trochę i taka mała dygresja, że z pętli
powinno być tylko JEDNO wyjście (kiedyś mi, i nie tylko mi zresztą to
profesor młotkiem tłumaczył i teraz tak mam :)), więc instrukcje typu
break, exit itp są niezbyt mile widziane, co nie oznacza, że czasem nie
można się bez nich obejść :). Można to tak zrobi poprawnie zmieniając jedną
Stary to ten twój profesor jest lub jest informatykiem który ukończył
Informatykę na uniwersytecie.

Problem polega na tym, że rzeczywistość to nie wyidealizowane procedury, w
jednym kodzie musisz zawrzeć główny algorytm, reagowanie na sytuacje
wyjątkowe, a wśród nich są takie nakazują wykonanie czegoś innego oraz takie
które zmuszają do natychmiastowego przerwania prac.

Zapis tego wszyskiego w postaci Jedno wejście - JednoWyjście i a wszystkie
możliwości w warunku pętli zagmatwa kod i zginie główny algorytm.

W TP stosowałem Goto koniec do obsługi błędów - jakim dobrodziejstwem dla
mnie było tray - except.

StoK
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.lang.delphi
Michał Dyrała
2004-11-18 15:37:00 UTC
Permalink
Dnia 18 Nov 2004 14:46:59 +0100, StoK napisał(a):

[...]

nie pisałem, że bezwzględnie i pod karą więxienia należy wywalić wszystkie
exit i breake ze swoich programów :). Napisałem, że jeśli jest to możliwe i
nie wprowadza dodatkowego skąplikowania kodu to należy postępować tak, żeby
pętla miała jedno wejście i jedno wyjście. W powyższym przykładzie
sprowadzało się to do zamiany jednej komendy na inną, więc w czym jest
problem? gdzie się biedaku zgubiłeś w moim zagmatwanym algorytmie?
--
Pozdrawiam Michał Misiekd Dyrała
Nikt nie jest doskonały
StoK
2004-11-19 15:43:17 UTC
Permalink
----- Original Message -----
From: "Michał Dyrała" <***@poczta.fm>
To: <pl-comp-lang-***@newsgate.pl>
Sent: Thursday, November 18, 2004 4:37 PM
Subject: Re: Przerwanie dzialania petli
Post by Michał Dyrała
[...]
nie pisałem, że bezwzględnie i pod karą więxienia należy wywalić wszystkie
exit i breake ze swoich programów :). Napisałem, że jeśli jest to możliwe i
nie wprowadza dodatkowego skąplikowania kodu to należy postępować tak, żeby
pętla miała jedno wejście i jedno wyjście. W powyższym przykładzie
sprowadzało się to do zamiany jednej komendy na inną, więc w czym jest
problem? gdzie się biedaku zgubiłeś w moim zagmatwanym algorytmie?
--
Pozdrawiam Michał Misiekd Dyrała
Nikt nie jest doskonały
Michale napisałeś:

"i taka mała dygresja, że z pętli
powinno być tylko JEDNO wyjście (kiedyś mi, i nie tylko mi zresztą to
profesor młotkiem tłumaczył i teraz tak mam .."

1.
"dygresja" - ozancza, że nie wypowiadasz się na temat listu, ale piszesz
na inny temat (tu ogólny)
2.
"powinno" - w naukach ścisłych ozancza to samo co "musi" jeśli nie
określiłeś gdzie a dodatkowo użyłeś słowa opisanmego w pkcie 1 tak wskazuje
treść twego listu to podmiotem domyślnym jest "zawsze i wszędzie".

NIE PISAŁEŚ:

" że jeśli jest to możliwe i nie wprowadza dodatkowego skąplikowania kodu to
należy postępować tak, żeby
pętla miała jedno wejście i jedno wyjście."


A drażnią mnie informatycy szczycący się, że ukończyli najlepsze
uniwersytety w Polsce, którzy powtarzają ciekawe zasady (niby), ale kod
wytworzony
przez nich nie da się czytać, i jest kulawy.

Może przysłać przykłady?

StoK
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.lang.delphi
Michał Dyrała
2004-11-19 23:56:42 UTC
Permalink
Dnia 19 Nov 2004 16:43:17 +0100, StoK napisał(a):

[...]
Post by StoK
A drażnią mnie informatycy szczycący się, że ukończyli najlepsze
uniwersytety w Polsce, którzy powtarzają ciekawe zasady (niby), ale kod
wytworzony
przez nich nie da się czytać, i jest kulawy.
ani nie najlepsza, ani nie ukończyłem (jeszcze). Jak nie umiesz czytać to
twój problem, nie mój. Nie uważam się za najlepszego ani wszechwiedzącego.
Gość, który ma doktorat z informatyki i napisał kilkadziesiąt artykułów dla
zachodnich czasopis chyba musi coś wiedzieć, a nie pierdolić od rzeczy.
Jestem ciekaw, czym ty się możesz poszczycić poza aplikacjami (a zapewne
jakieś napisałeś), które piszesz gdzieś tam na swoim komputerku i nikt poza
tobą nie ma do nich wglądu.

EOT
--
Pozdrawiam Michał Misiekd Dyrała
Nikt nie jest doskonały
babla
2004-11-22 11:41:42 UTC
Permalink
[...] chyba musi coś wiedzieć, a nie pierdolić od rzeczy.
Miałeś pecha w swoim życiu, że jakiś psor który nigdy nie wyprodukował
aplikacji, nie serwisował i nie rozwijał jej, który trenował się na
Odrze (nazwa komputera) chrzani trzy po trzy robiąc przy tym mądre miny.
Mnie się też zdarzyło, że uwierzyłem w mądrość swoich nauczycieli ale
życie zweryfikowało moje po(d)glądy.
Jeśli ktoś nie umie poprawnie logicznie uzasadnić dlacego TAK, a
dlaczego NIE, to oznacza to ni mniej ni więcej, że się nie zna i nie
należy tracić czasu na dalsze z nim konwersacje.

A teraz coś na temat:
1. break i continue są jak najbardziej słuszne i użycie ich w wielu
algorytmach jest jedynym rozsądnym wyjściem
2. czytelność kodu niejednokrotnie jest ważniejsza niż jego wydajność
3. ciekawi mnie jaki masz sposób (inny niż break) na przerwanie pętli
for/do?

pozdrawiam...
Andrzej Wąsik
StoK
2004-11-23 13:45:22 UTC
Permalink
----- Original Message -----
From: "babla" <***@spam.pl>
To: <pl-comp-lang-***@newsgate.pl>
Sent: Monday, November 22, 2004 12:41 PM
Subject: Re: Przerwanie dzialania petli
Post by babla
[...] chyba musi coś wiedzieć, a nie p....ć (serwer tego nie ptrzepuści)
od rzeczy.
Post by babla
Miałeś pecha w swoim życiu, że jakiś psor który nigdy nie wyprodukował
aplikacji, nie serwisował i nie rozwijał jej, który trenował się na
Odrze (nazwa komputera) chrzani trzy po trzy robiąc przy tym mądre miny.
Mnie się też zdarzyło, że uwierzyłem w mądrość swoich nauczycieli ale
życie zweryfikowało moje po(d)glądy.
Jeśli ktoś nie umie poprawnie logicznie uzasadnić dlacego TAK, a
dlaczego NIE, to oznacza to ni mniej ni więcej, że się nie zna i nie
należy tracić czasu na dalsze z nim konwersacje.
1. break i continue są jak najbardziej słuszne i użycie ich w wielu
algorytmach jest jedynym rozsądnym wyjściem
2. czytelność kodu niejednokrotnie jest ważniejsza niż jego wydajność
3. ciekawi mnie jaki masz sposób (inny niż break) na przerwanie pętli
for/do?
pozdrawiam...
Andrzej Wąsik
Drogi Andrzeju ten nieopierzony młodzik jest jeszcze w fazie szczeniaka
bezgranicznie wierzącemu swemu opiekunowi, do tego nie umie czytać ze
zrozumieniem, używa wulgaryzmów.

Z tych powodów nie warto odpowiać na jego zaczepki.

Podpiera się swoim profesorem, podejrzewam, że jest to człowiek na poziomie,
jak większość profesorów a niedouczony student coś namieszał i podpiera się
nim.

Ale jest iskierka nadzieji, szanuje władzę i świetnie będzie sobie radził w
systemach opartych na posłuszeństwie, może nawet zostać: politykiem,
policjantem, biskupem lub profesorem.

StoK
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.lang.delphi
babla
2004-11-23 14:08:17 UTC
Permalink
Post by StoK
Ale jest iskierka nadzieji, szanuje władzę i świetnie będzie sobie radził w
systemach opartych na posłuszeństwie, może nawet zostać: politykiem,
policjantem, biskupem lub profesorem.
Albo wyjedzie na Białoruś!
Amen.

pozdrawiam...
Andrzej Wąsik
Krzysztof Szyszka
2004-11-23 21:13:16 UTC
Permalink
Witam,
Post by babla
[...] chyba musi coś wiedzieć, a nie pierdolić od rzeczy.
Miałeś pecha w swoim życiu, że jakiś psor który nigdy nie wyprodukował
aplikacji, nie serwisował i nie rozwijał jej, który trenował się na
Odrze (nazwa komputera) chrzani trzy po trzy robiąc przy tym mądre miny.
Mnie się też zdarzyło, że uwierzyłem w mądrość swoich nauczycieli ale
życie zweryfikowało moje po(d)glądy.
Jeśli ktoś nie umie poprawnie logicznie uzasadnić dlacego TAK, a
dlaczego NIE, to oznacza to ni mniej ni więcej, że się nie zna i nie
należy tracić czasu na dalsze z nim konwersacje.
1. break i continue są jak najbardziej słuszne i użycie ich w wielu
algorytmach jest jedynym rozsądnym wyjściem
2. czytelność kodu niejednokrotnie jest ważniejsza niż jego wydajność
3. ciekawi mnie jaki masz sposób (inny niż break) na przerwanie pętli
for/do?
Nie bardzo wiem, czemu tak naskoczyliście na Michała - że słucha autorytetów?
Myślę, że to dobrze. W dzisiejszych czasach trudno takowych znaleźć, a to,
że Michał dopiero się uczy i nie zawsze potrafi uzasadnić pewne reguły
i dobrze wykorzystać je w praktyce, to chyba można mu na razie wybaczyć.

A teraz odnośnie poglądów profesora i czytelności kodu z mojego punktu
widzenia - praktyka, który sprzedaje również kody źródłowe komponentów.

Zasada jednego wyjścia z pętli jest stara jak Pascal i programowanie
strukturalne. Gdy te zasady były formułowane nie było w Pascalu instrukcji
break, exit i continue, które zrywają strukturalność programu. Na podstawie
tych zasad próbowano kiedyś dowodzić matematycznie poprawność
działania programów. Ta dziedzina dziś chyba już się nie rozwija, a do
Pascala wprowadzono kilka odstępstw od tych zasad, bo programista
jest z natury leniwy ;-)

Instrukcje break, exit i continue są czytelne i sam je czasem stosuję w
prostych procedurach, ale gdy algorytm jest bardziej skompikowany, to
tylko przeszkadzają. Często wracając do kodu po dłuższej przerwie
zapomina się o "tylnym" wyjściu z pętli lub procedury i potem traci
masę czasu na szukanie "głupich" błędów.

Jeśli chodzi o implementację break, exit i continue, to niczym się ona
nie różni od użycia "goto" poza tym, że nie trzeba deklarować etykiety,
bo miejsce skoku wynika z nazwy instrukcji. Co do używania goto, to
chyba nie muszę tu nic więcej pisać.

Ad. 1.
Break i continue są dzisiaj "legalnymi" instrukcjami w Pascalu, ale
to nie jest powód do potępiania kogoś, za to, że ich nie używa.
BTW. Goto i etykiety też nadal są w definicji języka :-)

Ad. 2.
Dla mnie czytelnośc kodu zawszy była i jest ważna, ale nigdy nie stała
w sprzeczności z wydajnością kodu. Jeśli już czasem trzeba wybierać,
to między wydajnością kodu, a jego rozmiarem, ale nigdy czytelnością.

Ad. 3.
Jeżeli pętla "for to do" wykonywana od First do Last może zakończyć się
na innym elemencie niż Last, to należy użyć innej pętli (while, repeat until).
Tyle mówią zasady. W klasycznym Pascalu (i przy dowodzeniu poprawności
algorytmów) wyjście z pętli "for to do" zawsze nastąpi po osiągnieciu
przez zmienną sterującą wartości Last, a wartość zmiennej sterującej po
wyjściu z takiej pętli jest nieokreślona i zmienna powinna być ponownie
zainicjowana przed jej kolejnym użyciem. Takimi zasadami nadal kieruje
się optymalizator, a użycie w pętli instrukcji Break powoduje pogorszenie
tej optymalizacji.

Przykład podany przez Michała nie był zbyt dobrze zapisany:

Wersja Michała:

while (i<255) do
begin
instr1;
instr2;
Application.procesmessage;
if flaga then
i := 255; // <- i w nastepnym przebiegu sam skończy pętle, bo warunek będzie false
end;

Dla poprawienia czytelności kodu należałoby to zapisać tak:

Wersja A:

Terminated := False;
I := 0;
while not Terminated and (I < 255) do
begin
Inc(I);
Instr1;
Instr2;
Application.ProcessMessages; // jakieś zdarzenie ustawia Terminated na True
end;

Prosto, czytelnie, w pełni strukturalnie i ... rozwojowo !!!
Wyjście z takiej pętli następuje przy Terminated = True lub I = 255
i w dalszej części kodu można te warunki również czytelnie testować,
a przy rozwijaniu programu można dodawać kolejne warunki wyjścia
z pętli i wszystkie można zobaczyć w jednym miejscu (w instrukcji while)
bez przegladania całej zawartości pętli !!!


Kod z użyciem instrukcji Break wyglądałby następująco

Wersja B:

Terminated := False;
I := 0;
while (I < 255) do
begin
Inc(I);
Instr1;
Instr2;
Application.ProcessMessages; // jakieś zdarzenie ustawia Terminated na True
if Terminated then Break;
end;

Na tym kodzie właściwie nie ma żadnego zysku, ani wydajnościowego,
ani pamięciowego, bo jedynie testowanie jednego z warunków zostało
przeniesione na koniec pętli. Za to trzeba przeczytać całą pętlę, żeby
zobaczyć drugi warunek wyjścia.

A przy użyciu pętli "for to do" wyglądałoby to tak:

Wersja C:

Terminated := False;
for I := 1 to 255 do
begin
Instr1;
Instr2;
Application.ProcessMessages; // jakieś zdarzenie ustawia Terminated na True
if Terminated then Break;
end;

Tu kod jest bardziej zwarty i użycie Break wydaje się być uzasadnionym,
bo procedura jest krótka, prosta i czytelna, ale przy bardziej rozbudowanej
używałbym wersji A. Wydajność obliczeniowa i pamięciowa wszystkich trzech
wersji jest właściwie taka sama.
--
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-Files Components
Borland Technology Partner
_________________________________________
Website: http://www.x-files.pl/ E-mail: ***@x-files.pl
babla
2004-11-24 07:46:57 UTC
Permalink
Post by Krzysztof Szyszka
Nie bardzo wiem, czemu tak naskoczyliście na Michała - że słucha autorytetów?
1. Więc niech słucha autorytetów a nie każdego kto wygląda na autorytet.
2. O rzeczach które liznął niech się więc nie wypowiada autorytarnie, a
nikt na niego nie będzie naskakiwał.
Post by Krzysztof Szyszka
[...] a do Pascala wprowadzono kilka odstępstw od tych zasad,
bo programista jest z natury leniwy ;-)
Przecież exit, break i continue nie są wymysłem pascalowców, są
praktycznie w każdym języku wliczając w to Jave i C#
Post by Krzysztof Szyszka
Jeśli chodzi o implementację break, exit i continue, to niczym się ona
nie różni od użycia "goto" poza tym, że nie trzeba deklarować etykiety,
bo miejsce skoku wynika z nazwy instrukcji.
Not so fast! Większość nauczycieli zakazuje używania goto ze względu na
fakt braku kontroli stosu i rejestrów - zamieniane jest na assemblerowe
JMP - i to jest dla mnie zrozumiałe. Każdy algorytm można bez większych
strat na wydajności czy czytelności tak skonstruować, żeby nie było
konieczne użycie skoku bezwarunkowego GOTO. Zrezygnowanie z BREAK i
CONTINUE, i zastąpienie ich jakąś konstrukcją warunków jednynie pogorszy
czytelność kodu i może właśnie doprowadzić do trudności w supportowaniu
takiego kodu - zwłaszcza przy algorytmach DSP.
Post by Krzysztof Szyszka
Break i continue są dzisiaj "legalnymi" instrukcjami w Pascalu, ale
to nie jest powód do potępiania kogoś, za to, że ich nie używa.
My się czepiamy jedynie niepotrzebnego gmatwania kodu w imię jakichś
niezrozumiałych zasad.
Post by Krzysztof Szyszka
BTW. Goto i etykiety też nadal są w definicji języka :-)
Tylko ze względu na backward compatibility.

Sprawdź sobie ile razy w źródłach VCL'a występuje słowo kluczowe goto
(ani razu), a ile razy break i continue (wielokrotnie).
Post by Krzysztof Szyszka
Dla mnie czytelnośc kodu zawszy była i jest ważna, ale nigdy nie stała
w sprzeczności z wydajnością kodu. Jeśli już czasem trzeba wybierać,
to między wydajnością kodu, a jego rozmiarem, ale nigdy czytelnością.
To właśnie break i continue zwiększają zarówno czytelność jak i
wydajność kodu, a goto - już nie bardzo.
Post by Krzysztof Szyszka
Jeżeli pętla "for to do" wykonywana od First do Last może zakończyć się
na innym elemencie niż Last, to należy użyć innej pętli (while, repeat until).
Tyle mówią zasady.
Jakie zasday? Pierwsze słyszę o takich zasadach.
Post by Krzysztof Szyszka
[...] wyjście z pętli "for to do" zawsze nastąpi po osiągnieciu
przez zmienną sterującą wartości Last, a wartość zmiennej sterującej po
wyjściu z takiej pętli jest nieokreślona i zmienna powinna być ponownie
zainicjowana przed jej kolejnym użyciem.
To jest oczywiste i dlatego właśnie śmiało można korzystać z for/do.

Takimi zasadami nadal kieruje
Post by Krzysztof Szyszka
się optymalizator, a użycie w pętli instrukcji Break powoduje pogorszenie
tej optymalizacji.
Skąd takie wiadomości?! ja widzę coś kompletnie odwrotnego:
przykład 1:
for i:=0 to 10 do begin
memo1.Lines.add(IntToStr(i));
if i=5 then
break;
end;

przykład 2:
i:=0;
while i<>11 do begin
memo1.Lines.add(IntToStr(i));
if i=5 then
break;
inc(i);
end;

przykład 3:
i:=0;
while i<>11 do begin
memo1.Lines.add(IntToStr(i));
if i=5 then
i:=10;
inc(i);
end;

a teraz jak sobie z tym poradził kompilator:
przykład 1 i 2 są identyczne:
xor ebx,ebx
..... // memo1.Lines.add(IntToStr(i));
cmp bl,$05
jz +$06
inc ebx
cmp bl, $0b
jnz -$2a

przykłda 3:
xor ebx,ebx
..... // memo1.Lines.add(IntToStr(i));
cmp bl,$05
jnz +$02
mov bl, $0a
inc ebx
cmp bl, $0b
jnz -$2c

.... i jak widać na załączonym obrazku kod 3 różni się od 1 i 2
dodatkową instrukcją MOV wydłużając się przy okazji o 2 bajty -
optymalizacja raczej marna.
Post by Krzysztof Szyszka
Prosto, czytelnie, w pełni strukturalnie i ... rozwojowo !!!
Wyjście z takiej pętli następuje przy Terminated = True lub I = 255
i w dalszej części kodu można te warunki również czytelnie testować,
a przy rozwijaniu programu można dodawać kolejne warunki wyjścia
z pętli i wszystkie można zobaczyć w jednym miejscu (w instrukcji while)
bez przegladania całej zawartości pętli !!!
Ale co ma peiernik do wiatraka. Spróbuj w ten sposób ominąć bloki
algorytmu.
Post by Krzysztof Szyszka
Tu kod jest bardziej zwarty i użycie Break wydaje się być
uzasadnionym,
Post by Krzysztof Szyszka
bo procedura jest krótka, prosta i czytelna, ale przy bardziej rozbudowanej
używałbym wersji A. Wydajność obliczeniowa i pamięciowa wszystkich trzech
wersji jest właściwie taka sama.
Życzę powodzenia z takim zapisem przy poważnych algorytmach. Jak chcesz
wyszstkie możliwe warunki wrzucić w jedno miejsce?!

Dyskusja jest ostra, ale nie mam zamiaru nikogo obrażać. Potraktujmy to
jako zbawawę w dociekanie prawdy, a nie jako udowadnianie komuś
niewiedzy, ok?

pozdrawiam serdecznie...
Andrzej Wąsik
Krzysztof Szyszka
2004-11-24 20:20:01 UTC
Permalink
Przeczytałem Pan odpowiedź dwa razy, a potem jeszcze raz swój
poprzedni post i dochodzę do wniosku, że albo ja nie umiem pisać,
albo Pan nie umie czytać ze zrozumieniem. W obu przypadkach
szkoda mi czasu na dalsze dyskusje o zasadach, tym bardziej,
że sam Pan przyznał, że pierwszy raz o nich słyszy.
BTW. Tak się zastanawiam czego dziś uczą na studiach?
--
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-Files Components
Borland Technology Partner
_________________________________________
Website: http://www.x-files.pl/ E-mail: ***@x-files.pl
babla
2004-11-25 09:07:37 UTC
Permalink
Post by Krzysztof Szyszka
Przeczytałem Pan odpowiedź dwa razy, a potem jeszcze raz swój
poprzedni post i dochodzę do wniosku, że albo ja nie umiem pisać,
albo Pan nie umie czytać ze zrozumieniem.
Chodzi mi o dość kategoryczne stwierdzenie Michała dotyczące continue i
break jakoby nie należałoby ich stosować ew. ograniczyć ich używanie
argumentując to zmniejszeniem czytelności algorytmu. Ja twierdzę że jest
dokładnie odwrotnie: break i continue zwiększają czytelność
zaimplementowanego algorytmu.
Wybacz jeśli odebrałeś to jako atak na swoją osobę.

Zgodzę sie co do jednego: każdy wybiera sam.
Nie zgodzę się z: terorią jakoby break i continue czyniły kod mniej lub
bardziej czytelnym.

to tyle, pozdrawiam serdecznie...
Andrzej Wąsik
Krzysztof Szyszka
2004-11-25 11:18:30 UTC
Permalink
Post by babla
Chodzi mi o dość kategoryczne stwierdzenie Michała dotyczące continue i
break jakoby nie należałoby ich stosować ew. ograniczyć ich używanie
argumentując to zmniejszeniem czytelności algorytmu. Ja twierdzę że jest
dokładnie odwrotnie: break i continue zwiększają czytelność
zaimplementowanego algorytmu.
Wybacz jeśli odebrałeś to jako atak na swoją osobę.
Nie odebrałem tego jako atak, ale osłabiło mnie to, co napisałeś tak bardziej
na zasadzie "a u was biją murzynów".
Post by babla
Zgodzę sie co do jednego: każdy wybiera sam.
Nie zgodzę się z: terorią jakoby break i continue czyniły kod mniej lub
bardziej czytelnym.
Widocznie nie masz nawyku analizowania warunków wejścia i wyjścia
z pętli, procedury lub innego bloku, który sam w sobie stanowi pewną
całość, a jego zawartość (podczas analizy) jest nie istotna dla reszty
kodu. Istotne są właśnie warunki wejścia i wyjścia. Sama treść kodu
w np. pętli może być dowolna (czasem na etapie projektowania nawet
pusta, a w trakcie implementacji wielokrotnie zmieniana), a mimo to
(przy zachowaniu warunków wyjścia) możesz projektować/pisać
dalsze fragmenty algorytmu. Takie wnętrze pętli może być dla
reszty kodu tzw. "czarną skrzynką". Może tak być do czasu, dopóki
nie użyjesz w nim Break lub Exit. Wtedy otwierasz "tylne" wyjście.
Pojawiają się dodatkowe warunki wyjścia, które musisz uwzględnić
w dalszej części kodu. Co więcej, żeby dowiedzieć się jakie są te
warunki, musisz zwykle przeanalizować całe wnętrze pętli. Stosując
się do tych zasad, których tak nie chcesz poznać, z góry wiesz, że
nie będziesz miał tego typu problemów, ale to się docenia dopiero
wtedy, gdy trzeba po dłuższym czasie wrócić do starego kodu.

Zakończę ten wywód jak pan minister: Wybór należy do Ciebie!
--
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-Files Components
Borland Technology Partner
_________________________________________
Website: http://www.x-files.pl/ E-mail: ***@x-files.pl
babla
2004-11-25 13:45:15 UTC
Permalink
Post by Krzysztof Szyszka
Widocznie nie masz nawyku analizowania warunków wejścia i wyjścia
z pętli, procedury lub innego bloku, który sam w sobie stanowi pewną
całość, a jego zawartość (podczas analizy) jest nie istotna dla reszty
kodu.
Być może tu jest pies pogrzebany.
W aplikacjach bazodanowych z których żyję prawie nigdy nie było
potrzeby osadzania dużych, skomplikowanych algorytmów. Natomiast w
systemach DSP i automatyce którą zajmuję się raczej jako hobby - choć i
z tego są pieniądze - algorytmy są naprawdę duże i pogmatwane (chociażby
algorytm sortowania motylkowego FFT), tam nagminnie używane są break i
continue.

reasumując: każdy rzeźbi jak mu wygodnie, ale niech z tego nie robi
jedynie słusznej ideologii.

pozdrawiam serdecznie...
Andrzej Wąsik
Krzysztof Szyszka
2004-11-25 17:07:28 UTC
Permalink
Post by babla
Post by Krzysztof Szyszka
Widocznie nie masz nawyku analizowania warunków wejścia i wyjścia
z pętli, procedury lub innego bloku, który sam w sobie stanowi pewną
całość, a jego zawartość (podczas analizy) jest nie istotna dla reszty
kodu.
Być może tu jest pies pogrzebany.
W aplikacjach bazodanowych z których żyję prawie nigdy nie było
potrzeby osadzania dużych, skomplikowanych algorytmów. Natomiast w
systemach DSP i automatyce którą zajmuję się raczej jako hobby - choć i
z tego są pieniądze - algorytmy są naprawdę duże i pogmatwane (chociażby
algorytm sortowania motylkowego FFT), tam nagminnie używane są break i
continue.
To mnie akurat nie dziwi, skoro "nagminie używane są break i continue" to
musi być pogmatwane :-), ale to nie wina algorytmu, tylko jego implementacji.
Post by babla
reasumując: każdy rzeźbi jak mu wygodnie, ale niech z tego nie robi
jedynie słusznej ideologii.
Nie chciałbym być na koniec złośliwy, ale sam się podkładasz: właśnie tak jest,
że jeden "rzeźbi", a drugi stara się poznać zasady, żeby nie musiał "rzeźbić" :-)
--
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-Files Components
Borland Technology Partner
_________________________________________
Website: http://www.x-files.pl/ E-mail: ***@x-files.pl
babla
2004-11-29 07:29:16 UTC
Permalink
Post by Krzysztof Szyszka
To mnie akurat nie dziwi, skoro "nagminie używane są break i continue" to
musi być pogmatwane :-), ale to nie wina algorytmu, tylko jego implementacji.
Popełniasz błąd sylogiczny. Są pogmatwane ergo pozwalam sobie na użycie
break i continue - nie na odwrót.
Post by Krzysztof Szyszka
Nie chciałbym być na koniec złośliwy, ale sam się podkładasz: właśnie tak jest,
że jeden "rzeźbi", a drugi stara się poznać zasady, żeby nie musiał "rzeźbić" :-)
Więc skoro sobie "pozwalasz" ;o)
... to wytłumacz mi dlaczego break i continue są tak "szkodliwe" dla
algorytmów. Tylko proszę nie powołuj się na żadne "wątpliwe" autorytety,
bo to dla mnie żaden argument - zresztą łatwy do obalenia.

pozdrawiam...
Andrzej Wąsik
Krzysztof Szyszka
2004-11-29 08:40:30 UTC
Permalink
Post by babla
Post by Krzysztof Szyszka
To mnie akurat nie dziwi, skoro "nagminie używane są break i continue" to
musi być pogmatwane :-), ale to nie wina algorytmu, tylko jego implementacji.
Popełniasz błąd sylogiczny. Są pogmatwane ergo pozwalam sobie na użycie
break i continue - nie na odwrót.
Post by Krzysztof Szyszka
Nie chciałbym być na koniec złośliwy, ale sam się podkładasz: właśnie tak jest,
że jeden "rzeźbi", a drugi stara się poznać zasady, żeby nie musiał "rzeźbić" :-)
Więc skoro sobie "pozwalasz" ;o)
... to wytłumacz mi dlaczego break i continue są tak "szkodliwe" dla
algorytmów. Tylko proszę nie powołuj się na żadne "wątpliwe" autorytety,
bo to dla mnie żaden argument - zresztą łatwy do obalenia.
Wiesz, wydawało mi się, że ta moja dotychczasowa pisanina właśnie temu
służy, ale skoro nic z tego co napisałem do Ciebie nie dociera, to chyba
nie ma sensu zaczynać od nowa, tym bardziej, że musiałbym rozpoczynać
od tłumaczenia czym jest algorytm, a czym jego implementacja.
--
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-Files Components
Borland Technology Partner
_________________________________________
Website: http://www.x-files.pl/ E-mail: ***@x-files.pl
babla
2004-11-29 10:33:57 UTC
Permalink
Post by Krzysztof Szyszka
nie ma sensu zaczynać od nowa, tym bardziej, że musiałbym rozpoczynać
od tłumaczenia czym jest algorytm, a czym jego implementacja.
Aaaa, tu jest pies pogrzebany ;o)
no tak, jedni mówią o konkretach, a inni o filozofii konkretów

... lepiej będzie ten problem roztrząsać przy pifku w oparach abstrakcji
niż anonimowo na grupie.

pozdrawiam...
Andrzej Wąsik
StoK
2004-11-30 14:14:57 UTC
Permalink
Post by babla
Post by Krzysztof Szyszka
nie ma sensu zaczynać od nowa, tym bardziej, że musiałbym rozpoczynać
od tłumaczenia czym jest algorytm, a czym jego implementacja.
Aaaa, tu jest pies pogrzebany ;o)
no tak, jedni mówią o konkretach, a inni o filozofii konkretów
... lepiej będzie ten problem roztrząsać przy pifku w oparach abstrakcji
niż anonimowo na grupie.
pozdrawiam...
Andrzej Wąsik
Jeszcze o tym dyskutujecie!?!?
Toż Michał się ucieszy, że wzbudził taką dyskusję.

Jeśli mamy dyskutować przy pifku (byle nie pif-paf), to się przyłączam.

Każdy ma swoje zdanie, jeżeli są jakieś wątpliwości natury ogólnej (a nie w
tym przypadku), to powtórze moje poglądy:

1. Break, continue - są bardzo użyteczne i znacznie bardziej czytelne od
równoważnej formy przerwania wykonywania instrukcji zawartych w pętli.

2. Ale użycie Break może być niebezpieczne jeśli przebudowywujemy program i
w dotychczasowych pętlach umieszczamy inne pętle obejmujące fragmenty
dotychczasowych pętli.

3. Wszystkie instrukcje strukturalne łamią zasadę jedno wejście - jedno
wyjście (wystarczy narysować sobie schemat blokowy)

4. Niektóre osoby drażnią procedury break, continue, exit, halt gdyż są one
"jednopoziomowe"

5. (parodia) Kilku moich (też starych) znajomych, absolwentów informatyki
twierdzi, że C to nie jest język wysokiego poziomu a makroasembler
(autorytety na studiach im to powiedziały).

Przykład zapisu pewnej struktury i jeśli funkcja zapisująca zwróci false
to nie należy kontynuować dalszych instrukcji w tym przebiegu pętli i należy
przerwać pętlę.


A Zasadniczy algorytm bez obslugi przerwania

repeat
poczatekBloku
osoba
dochody
costam
koniecBloku
until ....

B. W Wersji z if

repeat
if poczatekBloku then
if osoba then
if dochody then
if costam then
if koniecBloku then
else
przerwij := true
else
przerwij := true
else
przerwij := true
else
przerwij := true

until .... przerwij ...

C. Wersja z Break

repeat
if not poczatekBloku then
break;
if not osoba then
break;
if not dochody then
break;
if not costam then
break;
if koniecBloku then
break;
until ....

StoK
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.lang.delphi
StoK
2004-11-24 12:30:20 UTC
Permalink
Post by Krzysztof Szyszka
Nie bardzo wiem, czemu tak naskoczyliście na Michała - że słucha autorytetów?
Myślę, że to dobrze.
Michał dopiero się uczy i nie zawsze potrafi uzasadnić pewne reguły
i dobrze wykorzystać je w praktyce, to chyba można mu na razie wybaczyć.
Autorytety to naruszone zostały tak przy okazji, bo się nimi podpierał, ale
za wulgaryzmy, i inne obrażanie to mu się należy.
Gdyby Michałek nie rzucał się, to można by spokojnie wszystko
wyjaśnić.

Napisałeś ładną rozprawkę na temat, ładna analiza tego przypadku z
uzasadnieniem
Post by Krzysztof Szyszka
"Zasada jednego wyjścia z pętli jest stara jak Pascal i programowanie
strukturalne."

Ta zasada była potrzebna do tego by algorytmy tak jak klocki można było
zestawiać jeden za drugim, a fragmenty nią objęte można wydzielić i umieścić
w blokach, a bloki w procedurach.

Niestety program musi mieć rozgałęzienia i pętle, które psują tą linową
strukturę i nic na to nie poradzisz, wg analizy algorytmów ten sam algorytm
możesz zapisać z użyciem if, jak i continue lub break.

Break nie tworzy nowego wyjścia z pętli, ono tylko każe przejść do końca
pętli.
Pętla i tak tworzy swoje goto, czyli nie może być podzielona na
bloki, ale jej wnętrze tak.

Używanie Brek może być niebezpieczne gdy przerabiając program umieścimy w
istniejącej pętli pętle wewnętrzną, trzeba wówczas przerabiać kostrukcje
zawierające break i continue.

Jeżeli break = goto, to czym jest if, a if z elsem to dopiero same skoki
goto.
A try except end i try finally end - to powinno być całkowicie wykluczone i
grozić zakazem programowania przez 5 lat.

Reasumując; w końcu i tak wszystko sprowadza się do if i skoku (goto).

Goto Borlanda w Pascalu, to nie jest to samo co goto w Pascalu Wirtha czy
Basicu, tu można skakać tylko w obszarze procedury a w delphi nawet mniej.


Jeżeli w danym miejscu pracują trzy algorytmy, to kodowanie wszystkich w
warunkach pętli jednego
jest zamazaniem czytelności kodu.
I do tego właśnie jest goto, break, continue, try, exit.

StoK
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.lang.delphi
Krzysztof Szyszka
2004-11-24 21:14:01 UTC
Permalink
Napisałeś ładną rozprawkę na temat, ładna analiza tego przypadku z uzasadnieniem
Po przeczytaniu odpowiedzi od kolegi Babli żałuję, że to napisałem - szkoda mojego czasu.
"Zasada jednego wyjścia z pętli jest stara jak Pascal i programowanie strukturalne."
Ta zasada była potrzebna do tego by algorytmy tak jak klocki można było
zestawiać jeden za drugim, a fragmenty nią objęte można wydzielić i umieścić
w blokach, a bloki w procedurach.
Zgoda.
Niestety program musi mieć rozgałęzienia i pętle, które psują tą linową
strukturę i nic na to nie poradzisz, wg analizy algorytmów ten sam algorytm
możesz zapisać z użyciem if, jak i continue lub break.
Zgoda.
Break nie tworzy nowego wyjścia z pętli, ono tylko każe przejść do końca pętli.
Poza pętlę.
Pętla i tak tworzy swoje goto, czyli nie może być podzielona na
bloki, ale jej wnętrze tak.
Używanie Brek może być niebezpieczne gdy przerabiając program umieścimy w
istniejącej pętli pętle wewnętrzną, trzeba wówczas przerabiać kostrukcje
zawierające break i continue.
Dokładnie na to chciałem zwrócić uwagę! Napiszę jeszcze raz: nie potępiam
używania _dzisiaj_ break, exit i continue, bo są czytelne w prostych procedurach,
ale nie zalecam ich używania przy bardziej rozbudowanych algorytmach,
z powodów, o których sam piszesz powyżej i konieczności analizowania
całej pętli, żeby ustalić wszystkie warunki wyjścia.
Jeżeli break = goto, to czym jest if, a if z elsem to dopiero same skoki goto.
Napisałem: "Jeśli chodzi o implementację break, exit i continue, to niczym się
ona nie różni od użycia "goto" poza tym, że nie trzeba deklarować etykiety,
bo miejsce skoku wynika z nazwy instrukcji." i jest to zerwanie strukturalności
programu. Jak ktoś tego nie widzi, to niech sobie narysuje diagram blokowy.
To nie jest uwaga do Ciebie, ale odnoszę wrażenie, że niektórzy na tej grupie
nawet nie wiedzą co to jest :-(, a innych oceniają po rodzają używanego
komputera, tak jakby to miało jakieś znaczenie dla stosowania zasad.
A try except end i try finally end - to powinno być całkowicie wykluczone i
grozić zakazem programowania przez 5 lat.
Nie przesadzaj - to jest ścieżka awaryjnego wyjścia po błędzie, której nie ma
w definicji klasycznego Pascala i została "zapożyczona" przez Borlanda chyba
z Ady (nie jestem pewien, ale ja z tym pierwszy raz spotkałem się w Adzie).
Reasumując; w końcu i tak wszystko sprowadza się do if i skoku (goto).
Owszem, ale nie rozmawiamy o asemblerze, tylko o zasadach strukturalnego
programowania, a tam nie ma miejsca na żadne skoki (nie licząc instrukcji
warunkowej i warunku zakończenia pętli).
Goto Borlanda w Pascalu, to nie jest to samo co goto w Pascalu Wirtha czy
Basicu, tu można skakać tylko w obszarze procedury a w delphi nawet mniej.
Jeżeli w danym miejscu pracują trzy algorytmy, to kodowanie wszystkich w
warunkach pętli jednego jest zamazaniem czytelności kodu.
I do tego właśnie jest goto, break, continue, try, exit.
A tego to już nie rozumiem.
--
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-Files Components
Borland Technology Partner
_________________________________________
Website: http://www.x-files.pl/ E-mail: ***@x-files.pl
kpawel
2004-11-18 17:00:02 UTC
Permalink
Post by Michał Dyrała
nie powiem, że to nie działa, ale trochę i taka mała dygresja, że z pętli
powinno być tylko JEDNO wyjście (kiedyś mi, i nie tylko mi zresztą to
profesor młotkiem tłumaczył i teraz tak mam :)), więc instrukcje typu
break, exit itp są niezbyt mile widziane, co nie oznacza, że czasem nie
Nie mile widziane przez profesora ?? A ja nie lubie zielono-żółtych
samochodów. :P
Post by Michał Dyrała
można się bez nich obejść :). Można to tak zrobi poprawnie zmieniając jedną
A tego wnioskuję, że wczesniej napisane break nie jest poprawnym
rozwiązaniem. Otóż... nic badziej błędnego.
Post by Michał Dyrała
while (i<255) do
A nie lepiej tak:
while ((i<255) and (not flaga)) do
????
Post by Michał Dyrała
begin
instr1;
instr2;
Application.procesmessage;
if flaga then
i := 255; // <- i w nastepnym przebiegu sam skończy pętle, bo warunek
będzie false
end;
Po drugie - co Ci przeszkadza break ??? Potraktuj break własnie za to "i
:= 255" :)

A po trzecie - break co byś nie powiedział jest czytelniejsze niż "i :=
255". Zwłaszcza, że Twoje przypisanie nie jest odporne na zmianę tej
stałej (zmienisz warunek pętli i będziesz musiał poprawić wsyzstkie
wyjścia z niej).
--
Pozdrawiam
Paweł Konarski < kpawel >
function M:String;var i:Byte;begin M:='';for i:=0to 13do M:=Result+
chr(StrToInt(copy('7580658769766479786984468076',i*2+1,2)));end;
Loading...