import:外部ライブラリ内の関数呼び出し
Q:ルジャンドル関数など,
Gnuplotの組み込み関数にはない関数を使いたいのですが?
A:Version.5.0からは,
gnuplotの標準組み込みにない関数のライブラリを作成し,以下
のように
importコマンドを用いて,
ユーザー定義関数として呼び出す
plugin機能が導入されました.
import ユーザー定義関数名 from "ライブラリ名:関数名"
このライブラリの例は,demo_plugin.so がソースの demo/plugin
ディレクトリにあります.所望する関数は,demo_plugin.c に追記して,
makeし直すのが最も簡単です.ただし,demo_plugin.so しか作成されませんの
で,実際には
mv demo_plugin.so func_plugin.so
などと適当な名前に変更するのがよいかもしれません.demo_plugin.so
以外の新しいpluginを(ここではexfunc_plugin.soとしましょう)作成するには,
Makefile.amを編集して,Makefile.inを作成しなおさなければなりません.
それには開発版の
prepare(これは4.7-20140723に付
属のもの)コマンドを利用するのが近道です.以下に手順を示します.
関数の実装
さて,中身の問題ですが,関数をソースから書き起こすのは大変なので,
GNU Sientific Library を利用することを考えます.
Gnuplot の import に対する書式はdemo_plugin.c の雛形をそのまま使って,
次のようなgslの関数へのラッパーを作成すれば簡単に利用できます.
DLLEXPORT struct value gsl_Si(int nargs, struct value *arg, void *p)
{
struct value r;
double x, s;
RETURN_ERROR_IF_WRONG_NARGS(r, nargs, 1);
RETURN_ERROR_IF_NONNUMERIC(r, arg[0]);
r.type = CMPLX;
x = RVAL(arg[0]);
if (x == 0 ) {
r.v.cmplx_val.real = 0.0;
return r;
}
s = gsl_sf_Si(fabs(x));
r.v.cmplx_val.imag = FP_NAN;
r.v.cmplx_val.real = x > 0.0 ? s: -s;
return r;
}
gslにない(みつけられなかった)エルミート多項式や,フレネル積分関数の
ソース含んだものと,ついでに Makefile および demo/plugin/.depsにできる,
exfunc_plugin_so-exfunc_plugin.Po (環境依存します:これは Vine 6.3
x86_64) を参考に置いておきます.
exfunc_plugin.c,
Makefile,
exfunc_plugin_so-exfunc_plugin.Po
Vine 6.3 XF86_64 と 32bitのplamo 4.7 (名前を
gnuplot_plugin.soとしています)で作成した実
物も置いておきます.gsl.so と gslcblas.so が必須です.
exfunc_plugin.so,
gnuplot_plugin.so
使用例
exfunc_plugin.soをカレントに置いて,テストスクリプト
demo_exfunc.pltを実行した例(wxt)を示します.