2011-01-20 20 views
5

Actualmente estoy traduciendo algunos encabezados C en Delphi. No puedo encontrar una referencia para convertir un puntero de función de C a Delphi.C función de traducción del puntero a 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. ¿Cuál será la traducción de esta Delphi?

  2. ¿Dónde puedo encontrar buenos recursos para la conversión manual de los encabezados C a Delphi (incluidas las instrucciones de puntero, preprocesador, etc.)?

+0

introducido por error una respuesta como un comentario (ver más abajo para mi respuesta). –

Respuesta

8

uso de este tipo de código

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; 

Y el cambio cdecl a STDCALL, dependiendo de la convención de llamada de la biblioteca de C.

una declaración alternativa (más 'pascalish' tal vez) podría ser:

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 respuesta muy impresionante !! – ComputerSaysNo

+0

Gracias Bouchez. ¿Sabes dónde podría encontrar más información sobre la traducción de C a Delphi en Internet? Actualmente estoy usando el Blog de Rudy. – Ramnish

+1

@Ramnish No tengo ningún recurso a mano. Lo aprendí con el experimento. Pero eche un vistazo a algunas conversiones manuales de algunas API de C (como OpenGL/GDI +/SQLite) y encontrará algunos consejos. Lo bueno de Delphi es que puedes compilar el código C con el constructor C++ (incluido el compilador de línea de comandos gratuito) y luego vincular el .obj resultante a tu unidad Delphi. He usado algunas sugerencias de bajo nivel de asm como _ftol/_ftoul/_lldiv/_llshr y otras en http://synopse.info/fossil/finfo?name=SQLite3/SQLite3.pas –

1

utilidad HeadConv del Dr. Bob es una buena para usar para la conversión de declaraciones de C en Delphi, y es una buena herramienta de aprendizaje para comparar C código fuente al código fuente Pascal equivalente.

You can find it here

+2

es antiguo, y aparentemente nunca funcionó. go h2p –

+1

Funcionó para los encabezados de la API ODBC 3.0, con algunos ajustes al código resultante. En cuanto a la antigüedad, C no ha cambiado, ni tiene la sintaxis de Pascal para llamar bibliotecas y DLL externos, en los últimos 12-15 años. –

Cuestiones relacionadas