julia> using Cxx
julia> cxx""" #include <vector> """
true
julia> cxx""" std::vector<int> a = std::vector<int> (5,6); """
true
julia> icxx""" a[0]; """
(int &) 6
julia> b = icxx""" a; """
(class std::vector<int, class std::allocator<int> >) {
}
julia> b[0]
6
julia> b
(class std::vector<int, class std::allocator<int> >) {
}
上記のコードは、Julia端末に入力すると、ベクターデータが存在することを示しています。しかし、私はそれをJulia配列に完全に移すことを好むでしょう。これを行う最善の方法は何ですか?Cxxベクターをジュリアベクターに変換する
注:は、最終的に共有ライブラリがstd::vector<int>
を返すされますので、ご質問は、より明確に、標準ジュリアベクターにstd::vector<int>
を変換する方法が最善です。 (これは、例コードの変数b
を参照しています)。
ありがとうございます。
EDIT:問題は、そううまくいけば、次のことが役立つ明確ではないようですが、なぜのための推論が
julia> unsafe_wrap(Array, pointer(b), length(b))
ERROR: MethodError: objects of type Ptr{Int32} are not callable
julia> @cxx b;
ERROR: Could not find `b` in translation unit
julia> cxx" b; "
In file included from :1:
__cxxjl_17.cpp:1:2: error: C++ requires a type specifier for all declarations
b;
^
true
julia> icxx" b; "
ERROR: A failure occured while parsing the function body
julia> cxx" &b; "
In file included from :1:
__cxxjl_15.cpp:1:3: error: C++ requires a type specifier for all declarations
&b;
^
__cxxjl_15.cpp:1:3: error: declaration of reference variable 'b' requires an initializer
&b;
^
true
julia> icxx" &b; "
ERROR: A failure occured while parsing the function body
julia> @cxx &b;
LLVM ERROR: Program used external function 'b' which could not be resolved!
を(それは上記のコードから直接に続く)どんなにjulia参照変数を渡そうとすると、C++環境に解析することはできません(最後のものはjuliaを完全に破棄しました)。また、juliaにC++参照を渡すのに使用された同じメソッドを使用することもできません。 b
、@b
、b[0]
または&b[0]
のいずれかのポインタをつかみ、それらの作業を解析しようとしています。
'test/std.jl'を読んでください。 'v = icxx" std :: vector {2、4、6、8、10、12、14}; ";' unsafe_wrap(配列、ポインタ(v)、長さ(v) 。 –
@Isaiah変数参照がC++空間から始まり、julia空間に移動したので、これはうまくいきます。 Cxx.jのドキュメントでは、例8は、C++変数がジュリアの参照として(ジュリア空間で)直接格納されることを推奨しています。ここから、データを標準ジュリア配列に転送することは不可能であると思われます。あなたの例は変数 'a'に似ていますが、変数' b'の変換は問題のものです。 – user3303504