とCインタフェースIは、Cライブラリを使用していますジュリアパッケージを拡張しています。私はジュリアからいくつかのC関数を呼び出す必要があります。彼らはこのような何かを見て:私もジュリアの対応するタイプと宣言しているジュリア - 高調種類
struct contained {
int x;
int y;
int z;
};
struct mystruct {
int n;
contained* arr;
};
mystruct* mk_mystruct(int n, contained* arr);
void use_mystruct(mystruct* foo);
:引数としてcontained*
を取る
type contained
x::Int64
y::Int64
z::Int64
end
type mystruct
n::Int64
arr::Array{contained, 1}
end
ccall
に機能を、すべてがPtr{Int64}
としてcontained*
の治療正常に動作します:
con = fill(0, 5, 3);
mys = ccall((:mk_mystruct, "mylib"), Ptr{mystruct}, (Int64, Ptr{Int64}), n, con)
contained
は同じm em64の配列としてのemoryレイアウト。これは、Juliaパッケージ内の他の場所でも同様に行われます。しかし、返されたmystruct
の値を調べるために私が知っている唯一の方法は、unsafe_load
で逆参照することです。その時点で、Juliaはsegfaultからクラッシュします。 Juliaのポインタを逆参照する正しい方法は何ですか?
Cライブラリも含まれて機能し、その代わりに、私は不透明としてポインタを扱い、このC関数に戻って、それを渡すことができジュリアにポインタデリファレンスのかなり印刷:Cコードで
void print_mystruct(mystruct* foo, FILE* outputfile)
を、これはoutputfile=stdout
で呼び出されます。 ccall
でこれをどのように設定しますか?これは明らかに動作しません:
ccall((:print_mystruct, "mylib"), Void, (Ptr{mystruct}, Ptr{Void}), mys, stdout)
私はPtr{Void}
とstdout
の代わりに置く必要がありますか? JuliaはCインタフェースでI/Oをどのように実装していますか?
なぜ 'Int64'をCの' int'に対応する型として使うのですか? 'int'は普通32ビットで、おそらくは16ビットのように狭く、他にも多くのサイズがあります。 – chux
実際に私は 'Int'を使用しましたが、' Int'は私のマシン上で 'Int64'を意味するので、混乱しないように' Int64'を上のコードに入れました。私の理解では、Juliaが適切なサイズのIntを検出するので、このマシンCのintも64ビットです。あれは正しいですか? –
C言語の 'int'のサイズは、プロセッサではなくコンパイラとオプションによって制御されます。さまざまな理由で、32ビットと64ビットの両方の 'int'が64ビットマシン用のコンパイラで検出されます。 – chux