Thread View: pl.comp.lang.pascal
3 messages
3 total messages
Started by webmajsterek
Tue, 12 Oct 2010 08:02
Wadliwy kod wynikowy
Author: webmajsterek
Date: Tue, 12 Oct 2010 08:02
Date: Tue, 12 Oct 2010 08:02
66 lines
2453 bytes
2453 bytes
taki przykladowy program -- pokazuje że fpc w złej kolejnosci wywoluje funkcje
zawarte w wywołaniu procedury .
program error;
{$APPTYPE CONSOLE}
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
{$R *.res}
const tab:array[0..9]of byte =(0,1,2,3,4,5,6,7,8,9);
var Count:Integer;
Function ReturnByte:Byte;
begin
If Count>9 then Count:=0;
Result:=Tab[Count];
Count:=Count+1;
end;
procedure WriteByte(S:String;a,b,c,d:Byte);
begin
WriteLn(S,a,' ',b,' ',c,' ',d);
end;
var a,b:Byte;
begin
Count:=0;
WriteLn (' Orginal ',tab[0],' ',Tab[1],' ',Tab[2],' ',Tab[3]);
WriteByte(' Bad Result ', ReturnByte,ReturnByte,ReturnByte,ReturnByte);
WriteLn (' Orginal ',tab[4],' ',Tab[5],' ',Tab[6],' ',Tab[7]);
a:= ReturnByte;
WriteByte(' Bad Result ', a,ReturnByte,ReturnByte,ReturnByte);
WriteLn (' Orginal ',tab[8],' ',Tab[9],' ',Tab[0],' ',Tab[1]);
a:= ReturnByte;
b:= ReturnByte;
WriteByte(' Good Result ', a,b,ReturnByte,ReturnByte);
Readln;
end.
na
http://wiki.freepascal.org/Code_Conversion_Guide#Order_of_parameter_evaluation
pisza ze
"Delphi gwarantuje, że wszystkie parametry są obliczane od lewej do prawej. FPC
nie zawiera takich gwarancji, a może wywołać parametry w dowolnej kolejności w
celu wytworzenia optymalnego kodu."
I tu problem bo w 99.99 % przypadków wywołań kolejność ma znaczenie .
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: Wadliwy kod wynikowy
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 12 Oct 2010 09:42
Date: Tue, 12 Oct 2010 09:42
28 lines
1868 bytes
1868 bytes
On Tue, 12 Oct 2010 10:02:12 +0200, webmajsterek@poczta.onet.pl wrote: > taki przykladowy program -- pokazuje że fpc w złej kolejnosci wywoluje funkcje > zawarte w wywołaniu procedury . Nie w "złej" tylko w "innej niż Dephi", co jest zresztą udokumentowane w linku który podałeś: > na > http://wiki.freepascal.org/Code_Conversion_Guide#Order_of_parameter_evaluation > > pisza ze > "Delphi gwarantuje, że wszystkie parametry są obliczane od lewej do prawej. FPC > nie zawiera takich gwarancji, a może wywołać parametry w dowolnej kolejności w > celu wytworzenia optymalnego kodu." ...i nawet jest przedstawiony powód dla którego kompilator może chcieć reorder'nąć wywołania. > I tu problem bo w 99.99 % przypadków wywołań kolejność ma znaczenie . Nie, wbrew przeciwnie, w 99.(9)% przypadków poleganie na kolejności wywołań ,podobnie jak w podanym przykładzie, to poleganie na side-effect wywołania, a to jest bezwzględnie zła praktyka. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.pl/
Re: Wadliwy kod wynikowy
Author: Wiktor S.
Date: Tue, 12 Oct 2010 10:54
Date: Tue, 12 Oct 2010 10:54
13 lines
1342 bytes
1342 bytes
> taki przykladowy program -- pokazuje że fpc w złej kolejnosci > wywoluje funkcje zawarte w wywołaniu procedury . Jak to złej? Dokumentacja mówi, że kolejność jest niezdefiniowana. Więc każda kombinacja jest równie prawidłowa. > I tu problem bo w 99.99 % przypadków wywołań kolejność ma znaczenie . Używając FPC jesteś zmuszony tak pisać kod, aby to znaczenie miało dokładnie w 0,00%. -- Azarien
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads