Julia シリーズ 14: カスタム C/C++ ライブラリの呼び出し

15409401:

1. 基本的な呼び出し: ccall

呼び出しの基本的な形式は次のとおりです。
ccall((:函数名, 库地址), 输出格式, (输入格式列表), 输入数据)

以下に例を示します。

1.1 基本的なデータ構造

ここに画像の説明を挿入
ここに画像の説明を挿入

1.2 配列

1 つ目は入力配列です。変換が必要であることに注意してください。
ここに画像の説明を挿入

次に出力配列があり、これは unsafe_wrap で変換する必要があり、GC.@perserve でガベージ コレクションを防ぐ必要があります。
ここに画像の説明を挿入

2D 配列には C での番号付けに注意が必要です
ここに画像の説明を挿入

1.3 文字列

ここに画像の説明を挿入

1.4 複雑なデータ構造

ここに画像の説明を挿入

2.AST分析: Clang.jl

ヘッダー ファイルがあるとします。

// example.h
struct ExStruct {
    int    kind;
    char*  name;
    float* data;
};

void* ExFunction (int kind, char* name, float* data) {
    struct ExStruct st;
    st.kind = kind;
    st.name = name;
    st.data = data;
}

julia を使用してヘッダー ファイルを表示および分析するコードは次のとおりです。

julia> using Clang

julia> trans_unit = Clang.parse_header(Index(), "example.h")
TranslationUnit(Ptr{Nothing} @0x00007fe13cdc8a00, Index(Ptr{Nothing} @0x00007fe13cc8dde0, 0, 1))

julia> root_cursor = Clang.getTranslationUnitCursor(trans_unit)
CLCursor (CLTranslationUnit) example.h

julia> struct_cursor = search(root_cursor, "ExStruct") |> only
CLCursor (CLStructDecl) ExStruct

julia> for c in children(struct_cursor)  # print children
           println("Cursor: ", c, "\n  Kind: ", kind(c), "\n  Name: ", name(c), "\n  Type: ", Clang.getCursorType(c))
       end
Cursor: CLCursor (CLFieldDecl) kind
  Kind: CXCursor_FieldDecl(6)
  Name: kind
  Type: CLType (CLInt)
Cursor: CLCursor (CLFieldDecl) name
  Kind: CXCursor_FieldDecl(6)
  Name: name
  Type: CLType (CLPointer)
Cursor: CLCursor (CLFieldDecl) data
  Kind: CXCursor_FieldDecl(6)
  Name: data
  Type: CLType (CLPointer)

TranslationUnit は AST のエントリであり、次の 3 つの部分で構成されます。
Kind: カーソル ノードの目的
Type: カーソルによって表されるオブジェクトのタイプ
Children: 子ノードのリスト

Clang.getTranslationUnitCursor メソッドはルート ノードを取得できます。

次にメソッドの詳細です。

julia> using Clang.LibClang  # CXCursor_FunctionDecl is exposed from LibClang

julia> fdecl = search(root_cursor, CXCursor_FunctionDecl) |> only
CLCursor (CLFunctionDecl) ExFunction(int, char *, float *)

julia> fdecl_children = [c for c in children(fdecl)]
4-element Array{CLCursor,1}:
 CLCursor (CLParmDecl) kind
 CLCursor (CLParmDecl) name
 CLCursor (CLParmDecl) data
 CLCursor (CLCompoundStmt)

julia> [Clang.getCursorType(t) for t in fdecl_children[1:3]]
3-element Array{CLType,1}:
 CLType (CLInt)     
 CLType (CLPointer)
 CLType (CLPointer)

julia> [Clang.getPointeeType(Clang.getCursorType(t)) for t in fdecl_children[2:3]]
2-element Array{CLType,1}:
 CLType (CLChar_S)
 CLType (CLFloat)

おすすめ

転載: blog.csdn.net/kittyzc/article/details/130885974