golangのcgo---タイプ変換小試牛刀のC構造体とgo構造体変換
3693 ワード
前の記事では
まず例を見てみましょう.
上の例から,Cとgoの基本タイプ変換を利用したか,ポインタを利用したかが分かる.実行結果は次のとおりです.
これはCの構造体を介してgoにデータを転送し、同様にgoでデータを処理してCに渡すこともでき、基本タイプ変換を利用することもできる.ここで記録します. Cの構造体にtypedefが付いている場合、goでCの構造体を定義するにはstructは必要ありません.逆は逆. Goで定義C構造体:var struct C.DetectFaceInfo 再度注意、構造体に文字配列またはcharポインタがある場合、注意区別
go C
(http://blog.csdn.net/freeape/article/details/51885308)ですが、実際のプロジェクトでは基本タイプ間の変換だけでなく、関数パッケージでの値伝達やポインタ伝達が多く使われていますが、C機能関数やGoではどのようにして様々な値やポインタ伝達を行うのでしょうか.根本的な方法はやはり基本的なタイプを利用して、特によく使われるunsafe.Pointer
を含む.まず例を見てみましょう.
package main
/*
#include
#include
#include
#include
#define MAX_FACES_PER_DETECT 64
typedef struct Point{
float x;
float y;
}Point;
typedef struct Rectangle{
Point lt;
Point rd;
}Rectangle;
typedef struct DetectFaceInfo{
int id;
float score;
Rectangle pos;
}DetectFaceInfo;
void setStruct(void **ppDetectInfo)
{
DetectFaceInfo *pDetectInfo = (DetectFaceInfo *)malloc(sizeof(DetectFaceInfo));
memset(pDetectInfo, 0 , sizeof(pDetectInfo));
pDetectInfo->id = 1;
pDetectInfo->score = 0.98f;
pDetectInfo->pos.lt.x = 1;
pDetectInfo->pos.lt.y = 1;
pDetectInfo->pos.rd.x = 9;
pDetectInfo->pos.rd.y = 10;
fprintf(stdout, "A pDetectInfo address : %p
", pDetectInfo);
*ppDetectInfo = pDetectInfo;
}
int printStruct(void *pdetectinfo)
{
DetectFaceInfo * pDetectInfo = (DetectFaceInfo *)pdetectinfo;
fprintf(stdout, "B pDetectInfo address : %p
", pDetectInfo);
fprintf(stdout, "id: %d
", pDetectInfo->id);
fprintf(stdout, "score : %.3lf
", pDetectInfo->score);
fprintf(stdout, "pos.lt.x : %d
", pDetectInfo->pos.lt.x);
fprintf(stdout, "pos.lt.y : %d
", pDetectInfo->pos.lt.y);
fprintf(stdout, "pos.rd.x : %d
", pDetectInfo->pos.rd.x);
fprintf(stdout, "pos.rd.y : %d
", pDetectInfo->pos.rd.y);
}
int freeStruct(void *pDetectInfo)
{
fprintf(stdout, "C pDetectInfo address : %p
", pDetectInfo);
free((DetectFaceInfo*)pDetectInfo);
}
*/
import "C"
import (
_ "fmt"
_ "reflect"
"unsafe"
)
func main() {
var pDetectInfo unsafe.Pointer
C.setStruct(&pDetectInfo)
C.printStruct(pDetectInfo)
C.freeStruct(pDetectInfo)
}
上の例から,Cとgoの基本タイプ変換を利用したか,ポインタを利用したかが分かる.実行結果は次のとおりです.
A pDetectInfo address : 012832B0
B pDetectInfo address : 012832B0
id: 1
score : 0.980
pos.lt.x : 1.000
pos.lt.y : 1.000
pos.rd.x : 9.000
pos.rd.y : 10.000
C pDetectInfo address : 012832B0
これはCの構造体を介してgoにデータを転送し、同様にgoでデータを処理してCに渡すこともでき、基本タイプ変換を利用することもできる.ここで記録します.