Article View: pl.comp.lang.pascal
Article #92373Re: operatr - przyklad beldu
From: Łukasz 'Maly' Ostrowski
Date: Fri, 11 Jan 2008 10:18
Date: Fri, 11 Jan 2008 10:18
158 lines
6789 bytes
6789 bytes
webmajsterek@poczta.onet.pl wrote:
> 1.
> tworzymy nowy projekt w lazarusi e, 1 farma , na nia memo i button .
Primo: na chuj komukolwiek projekt w lazarusie? Wiesz co to znaczy
minimalny kompilujący się przykład? Nie wiesz.
> 2.
> kody unitow
>
> unit1
> <snip>
> Add('');
> Add('-------------------');
> Add('Niejeawne wywolanie operatora String:=ObjectAbstract+String');
> Add(Test+'Laczony lancuch -przez operator ');
>
> // mozna sie o tym przekonac po usneiciu ( linie zakomentowac )
> // operatora oznaczonego numerem 3 unit2
> // a teraz niespodzianka -- odkomentowac operator 2 i zakomentowac
> // operator 3 ( wczesniej bez nigo program sie nie kompilowal )
> // wniosek niejawnie kompilator podstawia w to miejsce operator 2
Bo to jest pierwsza konwersja na która natrafia i do której pasują
argumenty. Dziwi Cię to?
> Add('');
> Add('-------------------');
> Add('Niejeawne wywolanie operatora String:=String+ObjectAbstract');
> Add('Laczony lancuch -przez operator '+Test);
>
> // zakomentowac operator 4 ( operaotry wlaczoen 1 ,2,5 - 3,4
> wylaczoen ) // znowu niespodzianka - kompiluje sie .
> // niejawnie jest podstawiany operator 5 -- tka jak by chial dodac 2
> classy // mozna sie o tym przekoanc zakomentowujac operator 5 -
> wtedy sie nie kompiluje // oczywiscie odkomentowanie prawidlowych
> operatorow powoduje ze program // dziala poprawnie
>
> // wniosek - komilator podstawia co mu podpanie , i nie sposb
> // tego bledu wykryc
Nie co popadnie tylko co mu upośledzony klepacz podłoży a co jest
z punktu widzenia typów argumentów poprawne. Pierwsza opcja na którą
trafi podczas lookupa i w której pasują argumenty jest wybierana.
A jeżeli żadnej bezpośrednio nie ma, to następują 'próby z
konwersjami'. Żadnej filozofii w tym nie ma. Pierwsze na co
'wpadł' to konwersja ze stringa do Abstract'a - która mu podałeś
jako op2 - bo to później typy argumentów od razu pasują do
istniejącego innego operatora.
Widzisz jakieś sensowne wytłumaczenie w jakich okolicznościach
kompilator powinien korzystać z których dostępnych konwersji a
kiedy z innych - też pasujących, a kiedy z kolei powinno się
pojawiać:
Error XY1235: Unit1.pas:123 - W pizdu, webmajsterek nie
rzeźb tak, bo mi się wydaję że to nie zadziała
jak chcesz. Pozdrowienia, kompilator.
? Znajduje match'a podczas lookupa, to z niego korzysta.
W C++ jest od takich 'niespodzianek dla łebmajsterka' słowo kluczowe
explicit. Doczytaj sam dla siebie.
> //
> // Test:=Test+Byte(1); // ( 1 )
> // Test:=Test+Test; // ( 2 )
> end;
> end;
> <ciach żydowski cluster-fuck>
>
> 3. kolejny problem to tez jakies dziwne traktowanie przez kompilator
> przeciazania -- np dla Test w procedurze Add jest niejawnie
> wywolywany
> operator + dla przodka ( AbstractAbstract ) . A kilka lini nizej
> kompilator nie chce przepuscic dodawania mimo ze przodek ma
> zadeklarowane dodawanie Byte ( trzeba te linie odkomentowac ) .
Kolejne Primo, powiedzmy że Secundo: nie umieściłeś w interfejsie:
operator + (A:ObjectAbstract;B:Byte):ObjectAbstract;
znajduje się tylko w sekcji implementation także jeżeli
chodzi o pierwszy z tych dwóch przykładów - sygnatura
nie jest widoczna z innej jednostki kompilacji. I masz errora,
bo wtedy kompilator robi upcasta do AbstractAbstract i dopasowuje
się do sygnatury:
operator + (A:AbstractAbstract;B:Byte):AbstractAbstract;
ale, obczaj, to zwraca AbstractAbstract, a nie każdy
AbstractAbstract jest ObjectAbstractem, w obiektówce relacja is-a
działa tylko w jedna strone.
A co do 2, to nie masz operatora przyjmującego dwa concrete type'y,
więc znowu kompilator robi dopasowanie do:
operator + (A,B:AbstractAbstract):AbstractAbstract;
i znowu, nie przypiszesz wyniku do zmiennej typu ObjectAbstract.
Przyjrzyj się bardzo namiętnie tym dwóm linijkom - to może
zrozumiesz:
Test:=ObjectAbstract(Test+Byte(1));
Test:=ObjectAbstract(Test+Test);
to nie argumenty mu tu nie pasują, tylko return-type.
Z kolei te casty byłyby kompletnie niepotrzebne gdybyś tylko
wiedział na czym polega podejście obiektowe do dziedziczenia,
i fakt że nie jak już definiujesz kontrakt abstrakcyjny, to się
go trzymaj... i znowu, mówiąc wprost, Twoje 2 ostatnie linijki
działają tak jakbyś się tego spodziewał jeżeli tylko zrobisz
zamiast:
var Test:ObjectAbstract;
tak:
var Test:AbstractAbstract;
Na dobra sprawe całokształtu Twojego potworka niebyłbym do końca
pewien, w FPC chyba nie ma dynamicznego polimorficznego
dispatcha operatorów - nie są member functions więc następuje
tylko statyczna analiza na poziomie kompilacji, bo nie ma ich
w VTABLE/VMT/DMT/jak-zwal-tak-zwał. Nie chce mi się w to wnikać.
Projekt całości Twojego potworka posłużyłby mi raczej do
pokazania czego się *nie robi* TBH.
P.S. Nie możesz się trzymać coding-standards Object Pascala?
Literka T przed nazwą typu? Niepopierdolone skrajnie
nazwy jak np. AbstractAbstractObjectInterfaceAbstract?
P.P.S. DO CHUJA WAFLA ZAINSTALUJ JAKIEGOKOLWIEK PIERDOLONEGO
SPRAWDZACZA PISOWNI! BO WIECEJ NIE ODPOWIEM NA ZADNEGO
Z TWOICH "AMBITNYCH" POSTOW BO CZYTANIE CZEGOS CO
JEST PISANE METODA Monte-Carlo JEST KUREWSKO MECZACE.
[ilez to musi cie kosztowac czasu zeby bezblednie w
twoim ukochanym lazarusie napisac jedno slowo
kluczowe]
(sic).
P.P.P.S. Grupowiczów przepraszam za bluzgi, ale nie mam do Ciebie
nerwów, idz do sejmu. Mam nadzieje że merytorycznie
się wszystko zgadza w granicy błedu statystycznego.
--
Pozdrawiam,
Łukasz 'Maly' Ostrowski.
http://maly.nemo.pl/
Technical Details
Message-ID:
<fm7fv2$8hp$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<630c.0000006f.477cd90e@newsgate.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: Łukasz 'Maly' Ostrowski <maly@USUNnemo.pl> Newsgroups: pl.comp.lang.pascal Subject: Re: operatr - przyklad beldu Date: Fri, 11 Jan 2008 11:18:06 +0100 Organization: Dialog Net Lines: 159 Message-ID: <fm7fv2$8hp$1@news.dialog.net.pl> References: <630c.0000006f.477cd90e@newsgate.onet.pl> NNTP-Posting-Host: xdsl-2911.zgora.dialog.net.pl Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1200046882 8761 81.168.239.95 (11 Jan 2008 10:21:22 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Fri, 11 Jan 2008 10:21:22 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.3138 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit