2010-12-15 45 views

答えて

4

gnuplotはパイプ経由の入力をサポートしています(ウィンドウでは、これに別の実行可能ファイルがあります、pgnuplot)。そして、gnuplotに新しいコマンドを送ることができます。例えば、replotのように、gnuplotインターフェースに直接入力する場合と同じです。

パイプ接続を設定し、C++プログラムからパイプの送信側に書き込む方法は、オペレーティングシステムによって異なりますので、さらに役立つ場合は、使用しているものを教えてください。

Windowsでは、CreatePipeがあり、CreateProcessに渡されたSTARTUPINFO構造体の要素を設定します。 pgnuplotのステータスメッセージが必要な場合は、hStdOutputと同じです。

POSIX(Unix、Linux、Mac OSXなど)では、単方向接続を取得するための素早い方法としてpopenを使用できます。双方向の場合は、Windowsの場合と同様に動作します。pipeの場合は、fork、子プロセスの場合はdup2と入力してstdinとstdoutをパイプに関連付けます。には子プロセスを置き換えますセットアップ。

EDIT:the gnuplot documentationから:

特別なファイル名「 - 」は、データがインラインであることを 指定します。すなわち、それらは のコマンドに従います。コマンドに続くデータは のみです。 プロットのようなオプション フィルタ、タイトル、およびラインスタイル はプロットコマンドラインに残ります。この は、Unixシェルスクリプトの< <に似ています。 とVMS DCLの$ DECKに似ています。データは のように入力され、 のファイルから読み取られます.1つのデータポイントは レコードです。 の最初の文字「e」は、データ のエントリを終了します。これらのデータに を適用すると、 というフィルタリング機能を使用して、 という意味の関数にすることができますが、おそらく という列を選択することはできません。

+0

私はそれを考えましたが、個々のポイントを送信するコマンドは何ですか?私はデータファイルや関数をプロットする方法だけを知っています。 x1 y1、x2 y2のようにプロットするにはどうすればいいですか? – chutsu

+0

@chutsu:あなたは既にgnuplotの部分を知っていたと言っていたので、これらの詳細を提供しませんでした。とにかく、関連する段落をドキュメントから追加しました。 –

1

ソフトリアルタイムプロットに興味がある場合は、おそらくハードウェアアクセラレーションされたグラフィックスAPI(OpenGLなど)を使用し、チャートを自分でプロットするのが最適です。

+0

、アムは本当にgnuplotは、私が知っている準備ができて何である原因を使用することを期待して、私はPerlを使用したgnuplotに実際のデータをストリームさまざまなインターフェイスを見てきましたが、これは私のユニのコースのために割り当てているので、コースディレクターは本当に私がC++でそれをやりたいと思っています。 – chutsu

+1

「リアルタイム」とは何を意味するのかを定義します。 "1秒あたり25アップデート"を意味する場合、gnuplotはおそらくあなたのためではありません。 – etarion

+0

1つのプロットは、私には十分です。 – chutsu

3

これはCのインターフェイスですが、同じリンクにはC++のインターフェイスがいくつかあります。またはPlPlotを試すこともできます。

0

私のC++コードでは、g ++ Apple LLVMバージョン5を使用しているMac OsX mavericks上で動作しました。0):

#include <sys/types.h> 
#include <unistd.h> 

... 

// ready to make a plot 

pid_t childpid=fork(); 
if(childpid==0) { 
    // child process makes plot 
    std::FILE* pipehandle=popen("gnuplot -persist","w"); 
    // make some plot. You can send multiple commands to the pipe each ending in \n 
    std::fprintf(pipehandle,"plot \"results.txt\" using 1:2 with lines\n"); 
    std::fprintf(pipehandle,"quit\n"); 
    std::fflush(pipehandle); 
    std::fclose(pipehandle); 
    // child process exits 
    exit(0); 
} 
// parent process waits for child process to exit 
waitpid(childpid,NULL,0); 

// you can now repeat to make other gnuplots; all will appear simultaneously in the 
// terminal and are persistent after the parent process has finished. 
関連する問題