- ベストアンサー
gnuplotを使用してC言語からパイプを使って計算結果を表示する方法
- LinuxでC言語からパイプを使ってgnuplotに接続し、計算した結果を表示しようとする際、グラフの表示に時間がかかる場合の解決策を教えてください。
- gnuplotにパイプで接続し、1000回のループ内でグラフを表示する際、表示に時間がかかる現象が発生しています。対策方法を教えてください。
- LinuxでC言語からgnuplotにパイプを使って計算結果を表示しようとしていますが、グラフの表示に時間がかかる問題があります。解決策を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
意味がわかりました 次の二つを試してください 1、ループの外に出したfprintfをもどす 2、ループ内の最後にfflush(plotin);を追加する
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
このようなプログラムでのデバグのこつは、いきなりパイプを使うのではなく plotin = popen("gnuplot","w"); を plotin = fopen("debug.txt","w"); としてファイルの出力したり plotin = stdout; として標準出力に出力したりして、その内容が意図したものになっているかどうか確認することです。 ちなみに、私なら実運用でもpopenを使わず、標準出力のままコマンドラインでgnuplotにパイプで渡しますが。 ○このプログラムは「1組の(x,y)の点」というグラフを「(ループ回数)枚作図」するものになっています。これは意図したものなのでしょうか?「(ループ回数)組の(x,y)の点」というグラフを「1枚作図」ではないでしょうか。 後者なら fprintf(plotin,"plot '-' title \"oscillation\" \n"); for(略 { (略) fprintf(plotin,"%f %f\n", x,y); } fprintf(plotin,"e\n"); という流れになります。 ○ループカウンタとして使っている変数iですが > if( i == 10000){exit(0);} とループ回数から有り得ない判定があったり > i++; とfor以外のところで加算してたりしてます。この意図はなんでしょう? 提示したプログラムは完全なものですか? 省略したところは無いですか? 省略したところで変数iを使ってたりしませんか?そのためにループ回数がおかしくなっているとかは無いですか? struct sched_param param; struct timespec tt; と、定義されていない構造体があるので、省略した部分がある、と予想されるのですが。 あとは今回のとは関係ないですが ○このプログラムだと、最後のグラフを表示した次の瞬間、gnuplotが終了しますので、おそらく、グラフ表示したウィンドウが閉じます。set terminalを適切なものに設定するとか pause -1 で一時停止させるとかが必要です。 ○ main関数はint型にしましょう。
- vipasigaru
- ベストアンサー率38% (16/42)
forループから、一個目と三個目のfprintfを外に出せばいいと思うよ と言うかこれじゃグラフ出なくない?
補足
回答ありがとうございました。 申し訳ありません。 本来のプログラムは余計な情報が色々含まれていたので、質問用に荒削りしたものを乗せた所、色々と不具合のあるプログラムになってました。 お二方からご指摘いただいた部分を修正したプログラムを下記に添付します。 このプログラムを実行した結果、先にxとyの計算を10000回行い、計算が終了した後にグラフが生成されました。 この結果を元に新たに2つ質問させてください。 1:やりたい事としては、計算をしながらリアルタイムにgnuplotに点をプロットさせたいです。 (将来的にセンサから取得した値を逐一グラフで表示しながら確認したいため) 計算しながら表示というのは出来ないのでしょうか。 2:計算終了後からgnuplotの計算までに数秒の時間がかかります。 これは私のPCの性能のせいなのか、gnuplotの性能なのか、プログラムの書き方が間違っているのか、いったい何が原因なのでしょうか。 (一応PCを再起動して、無駄なプログラム等を終了してから試してみましたが結果は変わりませんでした。) もしお時間がありましたらご教授お願いいたします。 #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void){ FILE *plotin; double x , y; int i = 0; //gnuplotにパイプで接続 plotin = popen("gnuplot -persist","w"); fprintf(plotin,"plot '-' title \"oscillation\" \n"); //制御LOOP開始 for(i = 0 ; i < 10000 ; i ++) { //gnuplotで表示するグラフの計算 x = i * 0.01; y = x*x; //gnuplotに表示する fprintf(plotin,"%f %f\n", x,y); } fprintf(plotin,"e\n"); //gnuplot閉じる pclose(plotin); return 0; }