D言語でgnuplot
前回、ファイルからデータを読み込んで処理を加えることができたので、今度はそれをグラフにしてみることを考える。今までC++を使っていたので、CERNのROOTを読み込んでグラフを作っていたがD言語では使えないので、とりあえずパイプを使ってgnuplotを動かそうとした。C言語でいうpopenとpcloseのようなものを使えばいいが、結論から言ってわからなかった^^;しょうがないから、extern (C) を用いてCのpopenとpcloseを用いることにする。
とりあえず、popenとpcloseが使えるかどうかを確認。
import std.c.stdio; extern (C) FILE *popen(char *cmd, char *type); extern (C) int pclose(FILE *fp); int main(char [][] args) { FILE *gp; gp = popen("gnuplot -persist","w"); fprintf(gp,"plot sin(x)\n"); pclose(gp); return 0; }
これを、DMD 2.0 Windows版でコンパイルするが、Error 42: Symbol Undefined _popenと_pclose と出てリンクエラー。ここで数日悩む^^;C言語をバイナリは共通とのことなので、Cygwinのgdcを試すとうまくいった^^;例によってCygwinのgdcはまだバージョンが古いので公式サイトからCygwin用のgdc最新バージョンを導入する。うまくいくwとりあえずこれ(cygwin用gdc最新版)でコンパイル自体は上手くいった。X Windowを立ち上げて、実行してみるとgnuplotが立ち上がってsinカーブがちゃんと出てしばし感動w使い方がわかったので、自分の作ったものに組み込んでみると、実行速度が遅い^^;
Windows 上で dmd でコンパイルするとある環境では11秒で終了。gdc だと71秒^^;オワタ。。。試しにLinux上でdmdとgdcを入れて確認してみると、こちらはどっちも11秒。あぁ、つまりCygwin通してるから遅いのかと納得。よって、Windows版 dmd でpopenがきちんと使えるようにすれば多分実行速度が速いであろう。ってなわけで、なぜかWin版dmdで popen がリンク出来ないので設定などを確認してみようと思う。