2011-01-20 5 views
5

Attualmente sto traducendo alcune intestazioni C in Delphi. Non riesco a trovare un riferimento per la conversione di un puntatore a funzione da C a Delphi.C traduzione del puntatore di funzione in 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. Quale sarà la traduzione Delphi di questo?

  2. Dove è possibile trovare risorse valide per la conversione manuale di intestazioni C in Delphi (inclusi puntatore, direttive del preprocessore, ecc.)?

+0

accidentalmente aggiunto una risposta come commento (vedi sotto per la mia risposta). –

risposta

8

Utilizzare questo tipo di codice

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; 

E il cambiamento cdecl a stdcall, a seconda della convenzione di chiamata della libreria C.

Una dichiarazione alternativa (piu 'pascalish' forse) potrebbe essere:

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 risposta molto impressionante !! – ComputerSaysNo

+0

Grazie Bouchez. Sai dove posso trovare ulteriori informazioni sulla traduzione da C a Delfi in internet? Attualmente sto usando il blog di Rudy. – Ramnish

+1

@Ramnish Non ho alcuna risorsa a portata di mano. L'ho imparato con l'esperimento. Ma date un'occhiata ad alcune conversioni manuali di alcune API C (come OpenGL/GDI +/SQLite) e troverete alcuni suggerimenti. Ciò che è bello con Delphi è che puoi compilare il codice C con il costruttore C++ (incluso il compilatore di riga di comando gratuito), quindi collegare il risultato .obj alla tua unità Delphi. Ho usato alcuni suggerimenti di livello medio come _ftol/_ftoul/_lldiv/_llshr e tali in http://synopse.info/fossil/finfo?name=SQLite3/SQLite3.pas –

1

utilità HeadConv del Dr. Bob è un bene da utilizzare per la conversione dichiarazioni C in Delphi, ed è un buon strumento di apprendimento per il confronto C codice sorgente al codice sorgente Pascal equivalente.

You can find it here

+2

è antico e apparentemente non ha mai funzionato. go h2p –

+1

Ha funzionato per le intestazioni API ODBC 3.0, con alcune modifiche al codice risultante. Come per l'antico - C non è cambiato, né ha la sintassi Pascal per chiamare DLL e librerie esterne, negli ultimi 12-15 anni. –