C言語からの呼び出し
Q:C言語から gnuplot を呼び出すことができますか?
A1:ライブラリを
直接リンクするというのはかなり難しいので,gnuplot を子プロセスで起動して,
パイプでコマンドを渡す方法がよいでしょう.C言語に限らず「外部プログラム
を起動してパイプで通信する」機能が備わっている言語(awk, perl, python,
ruby等)は数多く,簡単に gnuplot を利用できます.
- リンク
筑波大学の高橋さんCのプログラムからGNUPLOTを動かす方法
愛知教育大学の山内さんGPTCALL
- 筆者が講義している「Cプログラミング」から,gnuplotに関する部分の抜
粋(gnuplot_with_C.pdf)とソー
スファイル群(gnuplot_w_C.tgz)です.
- 任意のデータをグラフ化するには,データファイルを介在させる方法が思
い浮かびますが,いかにも効率が悪い気がします.gnuplot は以下のよう
にして標準入力からデータを読み込む込ませることができます.
plot '-'
|
標準入力 '-' から読み込む
|
この後データを送ります.文字 'e' で始まる行がデータの終了です(mail
コマンドと同じです).2次元酔歩問題のシミュレーションを描くプログラ
ム例を以下に示します.rwalk.c
// プログラム名: rwalk.c
// コンパイル法: gcc -o rwalk rwalk.c -lm
// 実行: ./rwalk [maxiter] [interval]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#define L 512
main(int argc, char **argv)
{
int i, k, interval = 10000, maxiter = 100;
double x, y, S=sqrt(1.0/L);
FILE *GP;
if (argc > 1) maxiter = atoi(argv[1]);
if (argc > 2) interval = atoi(argv[2]);
srand48(time(NULL));
GP = popen("gnuplot -geometry 384x384","w");
fprintf(GP,
"set term x11\n"
"set xrange[-1:1]\n"
"set yrange[-1:1]\n"
"set nokey\n"
"set title '2D Random Walk' font 'Helvetica,24'\n");
fflush(GP);
usleep(100000);
for (k = 0; k < maxiter; k++){
fprintf(GP, "plot '-' with lines lt 1\n");
fflush(GP);
usleep(interval);
x=0; y=0;
for (i = 0; i < L; i++){
fprintf( GP, "%f %f\n",
x += S*(drand48()-0.5), y += S*(drand48()-0.5) );
}
fprintf(GP,"e\n");
fflush(GP);
usleep(interval);
}
fclose(GP);
}
- 実行結果
| GIF アニメーションです.
|