Błąd kompilacji D2XXUnit.pas

0

Potrzebuję w projekcie użyć komunikacji z układem FTDI FT232R za pomocą załączonej na dole w załączniku biblioteki D2XXUnit.pas i niestety mam problem z kompilacją.

Kompilacja utyka na poniższej funkcji:

Function Get_USB_Device_List : FT_Result;
Begin
SetLength(FT_DeviceInfoList,FT_Device_Count);
Result :=  FT_GetDeviceInfoList(FT_DeviceInfoList, @FT_Device_Count);
If Result <> FT_OK then FT_Error_Report('FT_GetDeviceInfoList',Result);
End;

a konkretnie problem z linią

Result :=  FT_GetDeviceInfoList(FT_DeviceInfoList, @FT_Device_Count);

Kompilator daje komunikat:

D2XXUnit.pas(711,50) Error: Incompatible type for arg no. 1: Got "Dynamic Array Of FT_Device_Info_Node", expected "Pointer"
D2XXUnit.pas(347,10) Hint: Found declaration: FT_GetDeviceInfoList(Pointer,Pointer):LongInt; StdCall;

Nie bardzo wiem o co mu chodzi bo na Delphi kompiluje się bezproblemowo a Lazarus nie chce.

Proszę o naprowadzenie mnie gdzie jest problem ewentualnie wskazanie w/w biublioteki dla Lazarusa

3

No ale czego w tym komunikacie nie rozumiesz? :P
Strzelam, że parametrem powinno być @FT_DeviceInfoList.

2

Przecież tam w kodzie biblioteki którą dałeś jest poprawnie:

Result :=  FT_GetDeviceInfoList(@FT_DeviceInfoList, @FT_Device_Count);
0

No właśnie ale Lazarus 1.4.2 nie chce tego skompilować i nie wiem w czym problem.

0

Jaki jest więc komunikat po zmianie?

0

Zmiany w listingu nie robiłem w/g mnie jest ok. Listing i komunikat kompilatora w pierwszym poście.

0

Ech.

Patryk27 napisał(a):

No ale czego w tym komunikacie nie rozumiesz? :P
Strzelam, że parametrem powinno być @FT_DeviceInfoList.

0

Patryk27 wytłumacz prościej ostatni post bo nie rozumiem. Przecież jest dokładnie tak w listingu który się nie kompiluje.

2
Result :=  FT_GetDeviceInfoList(FT_DeviceInfoList, @FT_Device_Count);

Spójrz na to, potem na mój post.
Ponownie na to, i znów na mój post.
Widzisz różnicę?

0

Miałeś rację że za mało razy o 2x popatrzyłem :) . Już zatrybiłem. Dzięki jest OK

1

{$mode DELPHI} zaraz po unit D2XXUnit

I to jest rozwiązanie problemu. :-)

Chodzi o kompatybiloność z DELPHI, nie ma tego domyślnie w Lazarusie, bo będzie OBJFPC.

1

Sprawdziłem u mnie bez problemu kompiluje się w najnowszym Lazarus czyli właśnie 1.4.2.
EDIT
Nie ważne czy ustawię {$mode objfpc} czy {$mode delphi}.

0

drorat1 masz rację też jest wszystko OK.

Dzięki wszystkim za pomoc. Temat rozwiązany komunikacja z FT232 ruszyła.

0

@drorat1 i inni - wpychanie do każdego projektu dyrektywy {$MODE DELPHI} to nie jest żadne rozwiązanie!

Jeśli projekt nie ma być kompatybilny z Delphi to czas po prostu naczyć się Free Pascala, a nie cudować z dyrektywami i obchodzić problem, zamiast go rozwiązać; Dialekt FP nieco różni się od standardowego Delphi, więc trzeba poznać te różnice i już - koniec tematu.

0

@furious programming

A kto tu mówi o obejmowaniu każdego projektu i co bardziej istotne jeszcze wszystkich modułów tą dyrektywą? Zresztą tą dyrektywą można objąć tylko ten jeden moduł, co zaś do tej dyrektywy, chyba nie wprowadzili tego bez powodu.

Lazarus ma opcję importu projektów z DELPHI, wiem że są pewne istotne różnice w przyjętych konwencjach, biorąc pod uwagę $mode objfpc i $mode delphi, nie rozumiem jednak w czym tu widzisz problem?

Bardziej bym się tu obawiał co do niezawodności, stabilności i poprawności samego połączenia przez wirtualny port COM, zresztą może być też taka opcja, że coś tam trzeba przenieść z DELPHI na Lazarusa, co w tym przypadku może oznaczać problemy nie wynikające wcale z tej dyrektywy.

To co zaproponowałem to moim zdaniem tylko i wyłącznie jedna z dwóch opcji, kod się nie kompilował bo nie było domyślnego ustawienia na $mode objfpc. Niestety ten jak i wiele innych podobnych wątków i to nie tylko na 4programmers ale i na GL pokazuje, że przejście z DELPHI na Lazarusa wcale nie jest takie proste jakby się to wydawało.

0

A kto tu mówi o obejmowaniu każdego projektu i co bardziej istotne jeszcze wszystkich modułów tą dyrektywą?

Ilekroć pojawia się problem z niemożnością kompilacji kodu przeniesionego z Delphi do Lazarusa, pierwszym sugerowanym "rozwiązaniem" jest zmiana dyrektywy kompilatora; Zdarza się to nawet w przypadkach, gdy kod nie jest przenoszony/importowany, tylko po prostu ktoś porzucił Delphi i zaczął pisać pod Lazarusem; A chyba najpopularniejszym tutaj jest przypisywanie metod do pól zdarzeniowych:

FOnClick := OwnOnClick;

No nie działa; Dlaczego? A no dlatego, że dialekt FPC wymaga użycia operatora @:

FOnClick := @OwnOnClick;

Ale nie - zamiast nauczyć się poprawnego zapisu, lepiej jest zmienić dyrektywę, a tym samym interpretację całego kodu modułu...

Lazarus ma opcję importu projektów z DELPHI, wiem że są pewne istotne różnice w przyjętych konwencjach, biorąc pod uwagę $mode objfpc i $mode delphi, nie rozumiem jednak w czym tu widzisz problem?

W tym, że wielu programistów uważa, że każdy kod dla FPC powinien być interpretowany jak kod dla kompilatora Delphi; I zamiast zasugerować użycie stricte Free Pascalowej konstrukcji, urządza się cyrki z dyrektywami, jakby one były lekiem na wszystkie błędy kompilacji;

[...] zresztą może być też taka opcja, że coś tam trzeba przenieść z DELPHI na Lazarusa, co w tym przypadku może oznaczać problemy nie wynikające wcale z tej dyrektywy.

Do tego celu właśnie jest narzędzie importowania kodu; Dyrektywa {$MODE DELPHI} istnieje po to, aby jeden kod mógł być kompilowany na dwóch kompilatorach -FPC i Delphi - bez otaczania fragmentów kodu np. dyrektywami {$IFDEF FPC} czy {$IFDEF DELPHI}; Tylko w tym przypadku ma to sens, a w innych jest to po prostu obchodzenie problemu na około i ignorancja wobec pewnych odstępstw dialektu FP;

To co zaproponowałem to moim zdaniem tylko i wyłącznie jedna z dwóch opcji, kod się nie kompilował bo nie było domyślnego ustawienia na $mode objfpc.

Jest jeszcze jedna opcja - brak jakiejkolwiek dyrektywy; Sytuacja, gdy nie ma ani {$MODE OBJFPC}, ani {$MODE DELPHI}; Wtedy kompilator zachowuje się jak ten z TP7 (albo i jeszcze starszego); I tak samo - jeśli kod ma być copy-paste przenośny na np. TP7 to się nic nie zmienia, ale jeśli nie - używa się standardowej dyrektywy i tym samym aktualnej składni;

Niestety ten jak i wiele innych podobnych wątków i to nie tylko na 4programmers ale i na GL pokazuje, że przejście z DELPHI na Lazarusa wcale nie jest takie proste jakby się to wydawało.

Owszem, nie jest takie proste jakby się to wydawało; Moduł importu projektów z Delphi też posiada wady i często trzeba jeszcze samemu poprawiać kod; Jednak jeśli zna się Free Pascala i jego różność od Delphi to przeniesienie kodu nie będzie już takie trudne; Trzeba wiedzieć gdzie co się znajduje, jakich modułów użyć, jaka składnia jest dopuszczalna dla jednego i drugiego kompilatora i wiele innych rzeczy;

Dlatego też zanim zaproponuje się zmianę dyrektywy, wypadałoby najpierw zrozumieć to w czym tkwi problem; A jedynym problemem w tym wątku jest brak małpek, a nie żadna dyrektywa czy domniemany problem przenośności kodu pomiędzy wymienionymi kompilatorami;

Dlatego też @Patryk27 podał rozwiązanie i tym samym rozwiązał nieistniejący problem; A problem praktycznie nie istniał od początku, bo @kAzek pokazał, że kod zawiera małpki; Więc jakimś cudem musiały zostać usunięte, co przełożyło się na niemożność kompilacji modułu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1