🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.pascal
Article #92373

Re: operatr - przyklad beldu

#92373
From: Łukasz 'Maly' Ostrowski
Date: Fri, 11 Jan 2008 10:18
158 lines
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-mail
References: <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