C言語でallocateされた構造体のダブルポインタをSwiftで取得する
C言語で書かれたソースを、Swiftのプロジェクトに組み込んでいた際にハマった、
C言語のDoublePointerの取得方法と、Swift上での値の参照方法についてメモ代わりに書きます。
例えば、以下の様な構造体をC言語で書いたとします。
doublePointer.c
typdef struct{
float a;
float b;
}t_str:
これを、ダブルポインタで使用する場合は以下のようにallocateします。
doublePointer.c
t_str** doubleP = NULL;
doubleP = calloc(sizeof(t_str*),100);
for(i=0;i<100;i++){
dounleP[i] = calloc(sizeof(t_str),100);
}
これで合計10,000個のt_str型データ領域が確保できました。
これをC言語で書かれたプログラムで使用後、Swiftのプログラムに渡す際
C言語のプログラムは以下のようになります。
doublePointer.c
t_str** DoublePointer()
{
t_str** doubleP = NULL;
doubleP = calloc(sizeof(t_str*),100);
for(i=0;i<100;i++){
dounleP[i] = calloc(sizeof(t_str),100);
}
/*
何かの処理
*/
return t_str;
}
Swift側では以下のようにして変数を宣言
Swift.swift
var swiftDoubleP = UnsafeMutablePointer<UnsafeMutablePointer<t_str>>?
Optinal型にし、?を付加します。
受け取り方は、
Swift.swift
swiftDoubleP = DoublePointer()
とし、データの取り出し方は、少しイレギュラーで以下のようにします。
Swift.swift
for i in 0..<100{
for j in 0..<100{
println(swiftDoubleP![i][j].a)
println(swiftDoubleP![i][j].b)
}
}
indexの前に!を挿入するのがミソです。
トリプルポインタもこんな感じでいけるのでしょうか。