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)