Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Property -- podwujna składnia

7 views
Skip to first unread message

webmaj...@poczta.onet.pl

unread,
Oct 14, 2010, 6:02:36 AM10/14/10
to

taki kodzik

Type PCell=^TCell;
TCell=Record
x,y,value:Integer;
end;

Type TMyClass=class
private
fArea:Array of Array of PCell;
public
property Items[x,y:Iteger]:PCell Read Get;Default;
end;


var MyClass:TMyClass;

teraz jak w kodzie odwolam
MyClass[1,1].x=10; // poprawnie
lub
MyClass[1,1]^.x:=10; // tez kompilator akceptuje ;

ale jak zrobie
with MyClass[1,1]^ do begin // tylko taka forme akceptuje kompilator
x:=10;
end;

kto� potrafi to wyt�umaczy� dlaczego tak si� dzieje ??

--
Wys�ano z serwisu OnetNiusy: http://niusy.onet.pl

Grzegorz Skoczylas

unread,
Oct 14, 2010, 6:52:17 AM10/14/10
to
W dniu 2010-10-14 12:02, webmaj...@poczta.onet.pl pisze:

> teraz jak w kodzie odwolam
> MyClass[1,1].x=10; // poprawnie

Zgodnie z definicją języka taki zapis (bez „^”) nie jest poprawny.
Kompilator go akceptuje, ale tylko w niektórych kontekstach.

Wydaje mi się, że jest to albo błąd w analizatorze składni (powodujący
jednak poprawne kompilowanie kodu), albo próba „poprawienia” pomyłek
programistów.

Uważam, że nie należy tak kodować.

--
Pozdrawiam,

Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------

Łukasz 'Maly' Ostrowski

unread,
Oct 14, 2010, 8:30:45 AM10/14/10
to
On Thu, 14 Oct 2010 12:02:36 +0200, webmaj...@poczta.onet.pl wrote:
> Type PCell=^TCell;
> TCell=Record
> x,y,value:Integer;
> end;
>
> <snip>
>
> var MyClass:TMyClass;

>
> MyClass[1,1].x=10; // poprawnie
> MyClass[1,1]^.x:=10; // tez kompilator akceptuje ;
>
> ale jak zrobie
>
> with MyClass[1,1]^ do begin // tylko taka forme akceptuje kompilator
> x:=10;
> end;
>
> kto� potrafi to wyt�umaczy� dlaczego tak si� dzieje ??

Albo jaki� syntactic sugar w fpc, albo b��d w analizatorze
kt�ry traktuje jakby ^TCell by� r�wnowa�ny class[w
uproszczeniu ^object, wi�c w uproszczeniu jest ;-)]
i poprawia . na dereference i member access operator z
automatu w AST, bo takie ma "ukryte" znaczenie member
access operator dla class.

A przy with nie ma explicite member access
operatora i pewnie dlatego siďż˝ kompilator gubi.

To drugie to domys�, nie kojarz� �eby by� taki cukier
sk�adniowy w fpc kiedykolwiek ;-), wi�c zak�adam
�e to bug jaki�.

--
Pozdrawiam,
�ukasz 'Maly' Ostrowski. http://l3v.pl/

Grzegorz Skoczylas

unread,
Oct 14, 2010, 9:14:12 AM10/14/10
to
W dniu 2010-10-14 14:30, �ukasz 'Maly' Ostrowski pisze:

> On Thu, 14 Oct 2010 12:02:36 +0200, webmaj...@poczta.onet.pl wrote:
>> Type PCell=^TCell;
>> TCell=Record
>> x,y,value:Integer;
>> end;
>>
>> <snip>
>>
>> var MyClass:TMyClass;
>>
>> MyClass[1,1].x=10; // poprawnie
>> MyClass[1,1]^.x:=10; // tez kompilator akceptuje ;
>>
>> ale jak zrobie
>>
>> with MyClass[1,1]^ do begin // tylko taka forme akceptuje kompilator
>> x:=10;
>> end;
>>
>> kto� potrafi to wyt�umaczy� dlaczego tak si� dzieje ??
>
> Albo jaki� syntactic sugar w fpc, albo b��d w analizatorze
> kt�ry traktuje jakby ^TCell by� r�wnowa�ny class[w
> uproszczeniu ^object, wi�c w uproszczeniu jest ;-)]
> i poprawia . na dereference i member access operator z
> automatu w AST, bo takie ma "ukryte" znaczenie member
> access operator dla class.
>
> A przy with nie ma explicite member access
> operatora i pewnie dlatego siďż˝ kompilator gubi.

Te� s�dz�, �e mniej wi�cej o to chodzi.

> To drugie to domys�, nie kojarz� �eby by� taki cukier
> sk�adniowy w fpc kiedykolwiek ;-), wi�c zak�adam
> �e to bug jaki�.

Podejrzewam, �e zosta�o to zaimplementowane dla zgodno�ci z Delphi,
gdzie te� to dzia�a podobnie.

Łukasz 'Maly' Ostrowski

unread,
Oct 14, 2010, 9:25:03 AM10/14/10
to
On Thu, 14 Oct 2010 15:14:12 +0200, Grzegorz Skoczylas wrote:
> Podejrzewam, �e zosta�o to zaimplementowane dla zgodno�ci z Delphi,
> gdzie te� to dzia�a podobnie.

Je�eli w dialekcie Delphi Object Pascala tak si� to zachowuje,
to mamy bezpo�redni pow�d dla kt�rego w FPC tak jest.
Od pocz�tku twierdzili �e chc� trzyma� kompatybilno�� z
Delphi i cross-kompilowalno�� �r�de� z D.

Wiktor S.

unread,
Oct 14, 2010, 3:39:51 PM10/14/10
to
Grzegorz Skoczylas wrote:
> W dniu 2010-10-14 12:02, webmaj...@poczta.onet.pl pisze:
>
>> teraz jak w kodzie odwolam
>> MyClass[1,1].x=10; // poprawnie
>
> Zgodnie z definicją języka taki zapis (bez „^”) nie jest poprawny.
> Kompilator go akceptuje, ale tylko w niektórych kontekstach.

Jest to zdecydowanie ficzer (udokumentowany) kompilatora. Słusznie czy
niesłusznie, nie jest to bug.

--
Azarien


Wiktor S.

unread,
Oct 14, 2010, 3:41:19 PM10/14/10
to
> To drugie to domys�, nie kojarz� �eby by� taki cukier
> sk�adniowy w fpc kiedykolwiek ;-), wi�c zak�adam
> �e to bug jaki�.

Jest taki w Delphi. Nie jest to bug.
FPC pozwala na to w trybie delphi {$MODE DELPHI}. W trybie "w�asnym" {$MODE
OBJFPC} to nie przejdzie.


--
Azarien

webmaj...@poczta.onet.pl

unread,
Oct 16, 2010, 10:11:12 AM10/16/10
to
>
> Je�eli w dialekcie Delphi Object Pascala tak si� to zachowuje,
> to mamy bezpo�redni pow�d dla kt�rego w FPC tak jest.
> Od pocz�tku twierdzili �e chc� trzyma� kompatybilno�� z
> Delphi i cross-kompilowalno�� �r�de� z D.
>

sprawdzi�em takie zachowanie by�o tylko gdy kod by� kompilowany ze zgodnoscia
dla Delphi . Przy wy��czeniu zgodno�ci kod si� nie kompilowa� i w ka�dym
miejscu gdzie by�o takie odwo�anie kompilator zg�asza� b��d .

0 new messages