Shiro Kawai
shiro****@lava*****
2004年 9月 13日 (月) 19:36:44 JST
お、面白そうなライブラリですね。 From: TOKUNAGA Hiroyuki <tkng****@xem*****> Subject: [Gauche-devel-jp] Gauche-cairo 0.0.0 Date: Mon, 13 Sep 2004 17:33:51 +0900 > * C側からの6つ以上の多値の返し方 > > cairo_matrix_get_affine (cairo_matrix_t matrix, double *a, double *b, > double *c, double *d, double *tx, double *ty) という関数があって、この関 > 数は後ろの6つの引数で指定されたアドレスに数字を格納します。Scheme側では > 多値を使って > > (receive (a b c d tx ty) (cairo-matrix-get-affine matrix) ... > > という形で使えるようにしたいと思うのですが、Scm_ValuesXはScm_Values5まで > しか用意されていないようです。C側から6つ以上の多値を返したいときはどうす > れば良いのでしょうか? > > # コードをちょっとみた感じでは戻り値をlistにしてScm_Valuesに渡せば良いのか > # なと思えましたが、自信がないです。 はい。Scm_Values()を使って下さい。 もしパフォーマンスがクリティカルであるなら、このような場合は6要素の f64vectorを返すような関数を別に作ることも考えられます。Scheme上で doubleの値を扱う場合は、box/unboxが入るのでかなりオーバヘッドが あるからです。呼び側がf64vectorを渡して結果を埋めるようにすると 余分なアロケーションも避けられます。 Gauche-glのAPIが参考になるかもしれません。 > * FILE構造体のScheme側での扱い方 > > cairo_surface_t * > cairo_png_surface_create (FILE *file, cairo_format_t format, int width, int height); > > > という関数があるのですが、対応するScheme側の関数をどうすればいいのかがわ > かりません。 Scm_PortFileNo(ScmPort*) を使うと、portがファイルに 結びつけられている場合はそのファイルディスクリプタを得ることが できます (portが文字列ポート等の場合は-1が返ります)。 それに対して fdopen(3) する、というのが順当な方法だと思います。 Scheme側からは、portを渡すようにしておけば良いんじゃないでしょうか。 但し、元となるportがScheme側でGCされると、ファイルディスクリプタも closeされてしまいます。ただ、元のC APIでもFILE*の有効期間はcaller 任せですから、あまり問題にならないとは思いますが。 --shiro