Shiro Kawai
shiro****@lava*****
2005年 4月 20日 (水) 05:33:29 JST
From: Makoto Satoh <makot****@yahoo*****> Subject: [Gauche-devel-jp] C から void* なデータを Scheme に渡すには? Date: Wed, 20 Apr 2005 01:01:34 +0900 (JST) > void* gdImageJpegPtr(gdImagePtr im, int *size, int quality) > > というGDの関数のバインディングを作りたいのですが、void*な > データをどのように返せば良いでしょうか? void*は、「俺(言語処理系)はこのデータの中身は知らないよ、自己責任で 使ってね」というデータ型なんで、Schemeレベルにそのまま見せるわけには いかないでしょう。Schemeオブジェクトはみんな自分が何者かを知っている はずですから。 用途によって2つくらいインタフェースが考えられます。 (1) opaqueなメモリーブロックオブジェクト Schemeレベルで、<gd-image-raw-block>みたいなオブジェクトを 作成して返します。オブジェクト中にはsizeとポインタを保持して おきます。ポインタはSchemeレベルには見せられないので、 それを使って何かするAPIは別に作ってやる必要があります。 (2) u8vectorにマップする u8vectorは一種のバイトベクタなので、Cでメモリブロックをバイト単位で アクセスするのに近い感覚で使える。バイナリI/Oもできるし。 (u8vectorのelementsに、他者のアロケートしたメモリを直接入れた 場合のメモリ管理についてまだちゃんと考えてないので、もしこれをやるなら Scm_MakeU8VectorFromArrayでメモリをコピーするようにして下さい)。 現状で一番無難なのは(2)かなと思います。ただ、uvectorとは別に メモリブロックを扱うオブジェクトを導入しようかどうか思案している ので、今すぐにこのAPIのバインディングが必要でないなら後回しに してもいいかもしれません。 --shiro