🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.pascal
3 messages
3 total messages Started by webmajsterek Tue, 12 Oct 2010 08:02
Wadliwy kod wynikowy
#93120
Author: webmajsterek
Date: Tue, 12 Oct 2010 08:02
66 lines
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
#93121
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 12 Oct 2010 09:42
28 lines
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
#93127
Author: Wiktor S.
Date: Tue, 12 Oct 2010 10:54
13 lines
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