2011-01-20 12 views
5

Obecnie tłumaczę niektóre nagłówki C na Delphi. Nie mogę znaleźć odniesienia do konwersji wskaźnika funkcji z C na Delphi.Przełożenie wskaźnika funkcji C na Delphi/Pascal?

typedef _JAlloc JAlloc; 
struct _JAlloc { 
    void *(*alloc) (JAlloc *allocator, size_t size); 
    void (*free) (JAlloc *allocator, void *p); 
    void *(*realloc) (JAlloc *allocator, void *p, size_t size); 
}; 
  1. Jaki będzie tłumaczenie Delphi tego?

  2. Gdzie mogę znaleźć dobre zasoby do ręcznej konwersji nagłówków C na Delphi (w tym wskaźnik, dyrektywy preprocesora itp.)?

+0

przypadkowo wszedł odpowiedź jako komentarz (patrz poniżej na moją odpowiedź). –

Odpowiedz

8

Zastosowanie tego rodzaju kodu

type 
    PJAlloc = ^TJAlloc; 
    TJAllocAlloc = function(allocator: PJAlloc; size: integer): pointer; cdecl; 
    TJAllocFree = procedure(allocator: PJAlloc; p: pointer); cdecl; 
    TJAllocRealloc = function(allocator: PJAlloc; p: pointer; size: integer); cdecl; 
    TJAlloc = record 
    alloc: ^TJAllocAlloc; 
    free: ^TJAllocFree; 
    realloc: ^TJAllocRealloc; 
    end; 

i zmienić cdecl do stdcall, w zależności od konwencji wywołującego z biblioteki C.

Alternatywą deklaracja (bardziej „pascalish” chyba) mogą być:

type 
    TJAllocAlloc = function(var allocator: TJAlloc; size: integer): pointer; cdecl; 
    TJAllocFree = procedure(var allocator: TJAlloc; p: pointer); cdecl; 
    TJAllocRealloc = function(var allocator: TJAlloc; p: pointer; size: integer); cdecl; 
    TJAlloc = record 
    alloc: ^TJAllocAlloc; 
    free: ^TJAllocFree; 
    realloc: ^TJAllocRealloc; 
    end; 
+0

+1 bardzo imponująca odpowiedź !! – ComputerSaysNo

+0

Dzięki Bouchez. Czy wiesz, gdzie mogę znaleźć więcej informacji na temat tłumaczenia z C na delphi w Internecie? Obecnie korzystam z bloga Rudy'ego. – Ramnish

+1

@Ramnish Nie mam żadnych zasobów pod ręką. Nauczyłem się tego z eksperymentu. Ale przyjrzyjmy się ręcznej konwersji niektórych API C (takich jak OpenGL/GDI +/SQLite), a znajdziesz kilka wskazówek. W Delphi jest to, że możesz skompilować kod C za pomocą budowniczego C++ (włączając w to darmowy kompilator wiersza poleceń), a następnie połączyć powstały .obj z jednostką Delphi. Użyłem kilku niskonakładowych porad asm takich jak _ftol/_ftoul/_lldiv/_llshr i takich w http://synopse.info/fossil/finfo?name=SQLite3/SQLite3.pas –

1

narzędzie doktora Boba HeadConv jest dobry w użyciu do konwersji deklaracji C w Delphi, i jest dobrym narzędziem edukacyjnym dla porównania Kod źródłowy C do równoważnego kodu źródłowego Pascala.

You can find it here

+2

to jest starożytne i na pozór nigdy nie działało. go h2p –

+1

Działał dla nagłówków API ODBC 3.0, z kilkoma dodatkami do wynikowego kodu. Co do starożytności - C nie zmieniło się, ani nie ma składni Pascala do wywoływania zewnętrznych bibliotek DLL i bibliotek w ciągu ostatnich 12-15 lat. –

Powiązane problemy