No dobra, jeszcze na chwilkę wpadłem – ”na długość kawki”. :]
Dlaczego kompilator rzuca błąd Incompatible types
przy przypisaniu temp
do TopElement
?
Dlatego że korzystasz z dwóch różnych typów danych. Nieważne, że oba są wskaźnikami typowanymi na taką samą strukturkę – dla kompilatora to dwa różne typy danych.
Dla potomnych: trzeba utworzyć nowy typ PElement : ^TElement
.
Do takich rzeczy utworzono wyjątkową konstrukcję, która pozwala wykorzystać typ danych, który jest zadeklarowany niżej (połączenie zwykłej deklaracji z forwardowaniem). W ten sposób można wykorzystać wskaźnik na strukturę do deklaracji pola w tejże strukturze:
type
PElement = ^TElement;
TElement = record
Data: integer;
Next: PElement;
end;
[…] czy ktoś z Was jest w stanie rzucić nowe światło na ten temat i wyjaśnić, czemu Delphi tak się zachowuje?
Ale co tu wyjaśniać? Dla kompilatora to dwa różne typy danych, dlatego rzuca błąd. Taka jest specyfika tego dialektu i trzeba mieć to na uwadze.
A tak poważnie - masz rację, ja nie lubię takich rozwiązań. Zawsze jak działam z "daszkami" to robię sobie do tego osobny typ, którego potem używam - dlatego nie zetknąłem się wcześniej z opisaną przez OP sytuacją/problemem.
Ale osobnego typu listy generycznej toś nie chciał deklarować… ;)
Zadeklarowanie osobnego typu danych nic nie kosztuje – jedna linijka i tyle, można używać wszędzie. Przy czym z ”daszków” można korzystać tylko do deklaracji, a w kodzie już nie. Automatyczna dereferencja wskaźników typowanych jest wspierana domyślnie przez Delphi, we Free Pascalu nie, ale można to zmienić dyrektywą {$MODESWITCH AUTODEREF}
.
Może to jest właściwa odpowiedź na pytanie czemu.
Odpowiedź jest prosta – bo takie było założenie, nie jest to bug czy WTF. Jeśli ktoś chce wiedzieć kto wpadł na taki pomysł i dlaczego taka decyzja padła to już musi pytać embarcadero.
A skoro są osobne dyrektywy dla konkretnej kompilacji to jakieś różnice muszą być.
Różnic pomiędzy trybami OBJFPC
a DELPHI
jest mnóstwo, tak samo jak pomiędzy trybami OBJFPC
a TP
czy pomiędzy dowolną inną parą. Każdy dialekt się czymś wyróżnia. Wsparcie trybów zostało wprowadzone po to, aby móc używać tego samego kompilatora do pisania kodu w różnych dialektach.
Przy czym dany tryb zdefiniowany za pomocą dyrektywy {$MODE}
obowiązuje tylko dla danego modułu, więc każdy moduł w danym projekcie może zawierać kod napisany w innym dialekcie (jeden w FPC
, inny w OBJFPC
, a jeszcze inny w DELPHI
). O ile jest taka możliwość, to raczej nie polecam takich mieszanin, bo może się to zemścić.