[Gauche-devel-jp] Re: C から void* なデータを Scheme に渡すには?

Back to archive index

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






Gauche-devel-jp メーリングリストの案内
Back to archive index