LoginSignup
9
9

More than 5 years have passed since last update.

[Swift vs C] C言語でallocateされた構造体のダブルポインタをSwiftで取得、使用する

Last updated at Posted at 2015-06-06

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の前に!を挿入するのがミソです。

トリプルポインタもこんな感じでいけるのでしょうか。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9