Simple Vector Graphics

pipe による gnuplot 利用

gnuplot を出力 device として application から利用するには、 Unix 系であれば pipe を使うところだが、Windows でうまくいくか どうか心配だった。試してみたところ Windows でも (少なくとも MinGW/gcc では)うまくいくので、しばしこの線を 探る。

しかし、日本語が通らない。一見通ってるように見えるが、通らない。 もう、、いい加減にして欲しい。Shift_JIS で2バイト目に 0x5c が 来ることがあるのは、日本語扱ったことのある人なら常識中の常識なんだが、、 「表示」の「表」の字やら、「構造」の「構」の字やらを出してみれば すぐわかる話なのに。しかも、本体では encoding utf8 が指定できるので utf8 で逃げようとしても window terminal では無視されてるみたいだし。

まあ iconv も日本語 patch なるものを当てないと、同じ問題を抱えてる みたいだし、今では UNICODE が default になっている Windows programming から 見ると、とてつもなく前時代に戻った気がする。

例題その 1

sin(x + dx) のグラフを dx を 0 - 9 まで1秒間に 1 ずつ増や しながら plot する。gnuplot の実行 file のありかに PATH が通っている こと。通っていない場合は、popen() の "gnuplot" の部分を full path にする。

/* gtest3.c -- invoke gnuplot with pipe */
/* Compile and link
 *   Windows (MinGW)
 *      gcc -o gtest3.exe -DWIN32 gtest3.c
 *   Linux
 *      gcc -o gtest3 gtest3.c
*/

#include <stdio.h>
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif	/* WIN32 */

int main()
{
	FILE *fgpl;
	int i;
	char sbuf[128];

	fgpl = popen("gnuplot","w");

	for(i = 0; i < 10; i++)
	{
		sprintf(sbuf, "plot sin(x+%d)\n", i);
		rewind(fgpl);
		fprintf(fgpl, sbuf);
		fflush(fgpl);
#ifdef WIN32
		Sleep(1000);
#else
		usleep(1000000L);
#endif	/* WIN32 */
	}

	pclose(fgpl);
	return 0;
}

注:

  • 待ち時間1秒間を得るのに Windows では Sleep() 関数、Linux では usleep() にした。 MingW にも usleep() があるのだが、なぜか全然働かない(待たない)。sleep() が使えるなら sleep() でもよいだろう。なお、Windows の Sleep() 関数は Kernel32.lib にある。
  • pipe に rewind するのは変かもしれない。しかし、(少なくとも昔の MS-DOS での 実装がそうだったように)一時 file による実装だと、file size が増大一方になる 可能性があるので、念のためこうしてある(エラーで戻る可能性はあるが実害は無いと 思うので)。もちろん実装によっては無視される可能性もある。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-12-25 (金) 14:02:46