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言語をバイナリは共通とのことなので、Cygwingdcを試すとうまくいった^^;例によってCygwingdcはまだバージョンが古いので公式サイトからCygwin用のgdc最新バージョンを導入する。うまくいくwとりあえずこれ(cygwingdc最新版)でコンパイル自体は上手くいった。X Windowを立ち上げて、実行してみるとgnuplotが立ち上がってsinカーブがちゃんと出てしばし感動w使い方がわかったので、自分の作ったものに組み込んでみると、実行速度が遅い^^;
Windows 上で dmdコンパイルするとある環境では11秒で終了。gdc だと71秒^^;オワタ。。。試しにLinux上でdmdgdcを入れて確認してみると、こちらはどっちも11秒。あぁ、つまりCygwin通してるから遅いのかと納得。よって、Windowsdmd でpopenがきちんと使えるようにすれば多分実行速度が速いであろう。ってなわけで、なぜかWin版dmdで popen がリンク出来ないので設定などを確認してみようと思う。