[Delphi vs C] Petla for

0

Taki oto prosciutki kod:

for initial_value to finally_statement do
begin
    finally_statement:=cokolwiek;
end

Moze ktos szybko i prosciutko wytlumaczyc dlaczego pascal naklada az takie ograniczenia, ze nie mozna finally_statement zmienic w czasie wykonywania petli?
(tak szukalem w dokumentacji, ale brak informacji dlaczego nie mozna zmianiac tej wartosci).
Poco autorzy az takie ograniczenia jezyka wprowadzili?

Np. w C mozna taka petle bez problemu wykonac, a wartosci zmienic w czasie wykonywania.

P.S. Zwracam honor temu Panu, ktory jednak mial racje. :)</delphi>

0

U mnie jak w petli zrobie Inc(finally_statement) to sie kompiluje bez problemu z tym że podczas działania progza petla zostanie wykonana i tak tylko tyle razy ile na poczatku mial wpisany finally_statement. A myśle że jest to spowodowane tym że mogłoby to spowodowac zamieszanie w petli np zapetlenie kompa ;)

0

Tez mi sie kompiluje, a sie zasugerowalem c :)

A jesli chodzi o nieskonczona petle to faktycznie, przy initial_value moglo by cos takiego powstac ale w momencie zmiany finally_statement to nie. Wiec dlatego zastanawia mnie sens zabronienia zmiany tej zmiennej.

0

Wydaje mi się ze jest to po prostu ograniczenie związane z charakterem Pascala. Tutaj każdy element składni jest przeznaczony tylko i wyłacznie do tego, do czego został zaprojektowany. Chcesz wykonać coś n-razy - stosujesz for..do. Chcesz wykonywać cos w zależności od spełnienia warunku - while..do / repeat..until. W C++ jest ogólnie bardzo duża dowolnośc, co może ułatwić programiscie prace, ale też robienie błędów. Pascal miał byc z załozenia jezykiem do nauki, a więc takie podejscie jest całkiem zrozumiałe.

0

Rzeczywiście w Pascalu jest to utrudnione.. ale na upartego zawsze można zmienić tą wartość wskaźnikiem i wszystko śmiga.

0

Jeśli się nie mylę, to tu chodzi o coś innego. O szybkość wykonania pętli (w czasach powstawania języka było to istotne).

Jeśli założymy, że nie można zmieniać tych wartości w pętli, to w asmie będzie to tak ("na oko"):

mov cx,finally_statement
sub cx,initial_value
inc cx
abc:
  ;tu ciało pętli
dec cx
jnz abc ;zamiast tych 2 instrukcji mogłoby być tylko loop, lecz jest ona 5x wolniejsza

Natomiast, jeśli by zezwolić na zmianę finally_statement to kod musiałby robić takie coś:

mov cx,initial_value
abc:
  ;tu ciało pętli
inc cx
cmp cx,finally_statement ;porównanie z komórką pamięci
jb abc

Przy obecnych prockach różnica jest jednego taktu, ale może w starszych była większa. Ale nie mam danych na ten tenat - to tylko moje marne przemyślenia o 2 nad ranem...

0

kiedys nawet chyba na tym forum byla mowa o dyrektwywie w Delphi, po której ustawieniu można było zmieniać initial_value podczas działania pętli. Być może do finally_statement bedzie podobnie

0
CyberKid napisał(a)

można było zmieniać initial_value podczas działania pętli.

A jaki miałoby to mieć sens?

0
pq napisał(a)
CyberKid napisał(a)

można było zmieniać initial_value podczas działania pętli.

A jaki miałoby to mieć sens?

chocby taki ze moznabylo zrobic

for i := 0 to 2 do
i:=0;

i wtedy miales nieskonczona petle. Zreszta nie mowie ze to mialo sens, ale ze cos takiego bylo.

0
Malcolm napisał(a)
for initial_value to finally_statement do
begin
    finally_statement:=cokolwiek;
end

Troche zamotales, nigdzie nie mozna zmienic finally_statement, kontrukcja for wyglada przeciez

for zmienna := initial_value to finally_statement do

i mniemam, ze chodzi ci o zmiane wartosci "zmienna", jak napisal Detox wskaznikiem da sie zmienic, wiec to ograniczenie jest pewnie zrobione umyslnie. Marooned ~ wez pod uwage, ze trzeba zalozyc, ze w petli moze byc inna petla, wiec tak tylko na rejestrach nie mozemy tego zrobic.

A sens ... coz, kto z was nie chcial kiedys zrobic for'a ktory 'skakal' o 2? ;)

0
Wolverine napisał(a)

A sens ... coz, kto z was nie chcial kiedys zrobic for'a ktory 'skakal' o 2? ;)

Bo trzeba programować w PowerBasicu, nie w jakimś paskudnym Pascalu.

wtedy for i=1 to 313 step 3 działa

lepiej nawet, działa też:

for f=1.3 to 12.512 step 0.01

case (tam: select case) działa na floatach i stringach. Ech, to był język :-)

0
pq napisał(a)

case (tam: select case) działa na floatach i stringach.

A w Bourne Shell także i wyrażeniach regularnych :P Ale to jest interpretowany i tam wydajność jest mierzona troszkę inaczej :P

0
Wolverine napisał(a)

A sens ... coz, kto z was nie chcial kiedys zrobic for'a ktory 'skakal' o 2? ;)

Wystarczy ze pomnozysz licznik przez 2 [green]

0

Hehe jeszcze w Pascalu można było modyfikować zmienną sterującą pętli, więc np.

for i := 0 to 999999 do
  i := i * 50 div 477; // :)

Niestety w Delphi już taka instrukcja nie przejdzie.

0
pq napisał(a)
Wolverine napisał(a)

A sens ... coz, kto z was nie chcial kiedys zrobic for'a ktory 'skakal' o 2? ;)

Bo trzeba programować w PowerBasicu, nie w jakimś paskudnym Pascalu.
O C chyba nie muszę wspominać? :>

for (int i=0; i<10; i+=2){}

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