2010-12-04 9 views
1

におけるCのコールバックのための関数へのポインタを提供する:私は同等のDelphiのバージョンに、次のCヘッダを変換しようとしているデルファイ

/** pointer to a malloc function, supporting client overriding memory 
* allocation routines */ 
typedef void * (*yajl_malloc_func)(void *ctx, unsigned int sz); 

/** pointer to a free function, supporting client overriding memory 
* allocation routines */ 
typedef void (*yajl_free_func)(void *ctx, void * ptr); 

/** pointer to a realloc function which can resize an allocation. */ 
typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, unsigned int sz); 

typedef struct 
    { 
     /** pointer to a function that can allocate uninitialized memory */ 
     yajl_malloc_func malloc; 
     /** pointer to a function that can resize memory allocations */ 
     yajl_realloc_func realloc; 
     /** pointer to a function that can free memory allocated using 
     * reallocFunction or mallocFunction */ 
     yajl_free_func free; 
     /** a context pointer that will be passed to above allocation routines */ 
     void * ctx; 
    } yajl_alloc_funcs; 

私のDelphiのコードでは、現時点では次のようになります。

Tyajl_malloc_func = function(context: pointer; sizeOf: Cardinal): Pointer of Object; cdecl; 

    Tyajl_free_func = procedure(context: pointer; ptr: Pointer) of Object; cdecl; 

    Tyajl_realloc_func = function(context: pointer; ptr: Pointer; sizeOf: cardinal): Pointer of Object; cdecl; 
    yajl_alloc_funcs = record 
    malloc: Tyajl_malloc_func; 
    free: Tyajl_free_func; 
    realloc: Tyajl_realloc_func; 
    ctx: pointer; 
    end; 

問題は、2つの関数へのポインタを取得する方法を覚えていないので、私がこれらを間違って扱っていることを確信していることです。私の質問は:例えば、malloc関数をyajl_alloc_funcs.mallocに代入しようとすると、どのようにポインタを得ることができるのでしょうか?

また、私が翻訳で間違っていることをしている場合、ここでは「適切な」アプローチは何ですか?

更新:私は何を求めているのか混乱しているようです。私は、実際のメソッドを実装しているし、次のコードを使用して前述-貼り付けたレコードを使用してDLLにそれらを供給しようとしています: E2009互換性のないタイプ::私のエラーを与える

var 
    alloc_funcs: yajl_alloc_funcs; 
begin 
    FillChar(alloc_funcs, SizeOf(alloc_funcs), #0); 
    alloc_funcs.malloc := yajl_malloc; 
    alloc_funcs.free := yajl_free; 
    alloc_funcs.realloc := yajl_realloc; 
.. 

「定期的な手順や方法をポインタ ' ヘッダーの翻訳で何か問題があったため、疑わしいと思われます。

ご協力いただければ幸いです。

+0

*デルファイへ* C *からの変換*を?あなたはもっと良いロジックを書き直す... –

+0

@ ring0 - 私はあなたのポイントを見ているのか分からない、どこで論理的な問題ですか? – jamiei

+0

@ ring0あなたが質問を理解していない –

答えて

0

これで、このCライブラリに渡すmalloc freeおよびreallocという関数を定義する必要があります。 Delphiでは、GetMem、FreeMem、ReallocMemを呼び出すことでそれらを実装できます。

+0

混乱の謝罪。問題は関数の実装ではありませんが、私はヘッダーの変換と思っています。 – jamiei

+0

このコードでは、Cライブラリのメモリ割り当てをオーバーライドできます。あなたがこれをしたいなら、malloc、freeなどを提供する必要があります。これをしたくなければ、これを無視することができます。 Sergは正しいですが、オブジェクトはインスタンスメソッドではなく自由な関数なので、間違いです。 –

+0

Davidさん、ありがとうございました。私は彼らが何をしているのかを認識しています。実装は既に別のところにありますが、私の問題がどこにあるのかという翻訳されたヘッダーを使用する際に問題があります。 – jamiei

4

"of Object"は使用しないでください。ここでは関係ありません。


更新:コードの行はあなたにエラーを与えますか?私は予想通り、次のコードがコンパイルされ、動作しますが、それを想像することはできません。

type 
    Tyajl_malloc_func = function(context: pointer; sizeOf: Cardinal): Pointer; cdecl; 
    Tyajl_free_func = procedure(context: pointer; ptr: Pointer); cdecl; 
    Tyajl_realloc_func = function(context: pointer; ptr: Pointer; sizeOf: cardinal): Pointer; cdecl; 

    Tyajl_alloc_funcs = record 
    malloc: Tyajl_malloc_func; 
    free: Tyajl_free_func; 
    realloc: Tyajl_realloc_func; 
    ctx: pointer; 
    end; 

function yajl_malloc_func(context: pointer; sizeOf: Cardinal): Pointer; cdecl; 
begin 
    Result:= Pointer($1234); 
end; 

var 
    yajl_alloc_funcs: Tyajl_alloc_funcs; 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
    yajl_alloc_funcs.malloc:= yajl_malloc_func; 
    ShowMessage(Format('%p', [yajl_alloc_funcs.malloc(nil, 0)])); 
end; 
+0

関数にレコードを割り当てる行です。互換性のない型、CardinalとPointerのエラーが発生します。 – jamiei

関連する問題