電子書籍の厳選無料作品が豊富!

現在、linuxでC言語からパイプを使ってgnuplotに接続し、計算した結果をすぐに表示しようとしています。

下のようなプログラムでうまくいくと思ったのですが、グラフが表示されるのにすごい時間がかかってしまいます。
解決策をご存知でしたらご教示お願いいたします。


#include<stdio.h>
#include<stdlib.h>
#include<math.h>


void main(){

FILE *plotin;
double x , y;
int i = 0;

struct sched_param param;
struct timespec tt;


//gnuplotにパイプで接続
plotin = popen("gnuplot","w");


//制御LOOP開始
for(i = 0 ; i < 1000 ; i ++)
{

if( i == 10000)
{
exit(0);
}

//gnuplotで表示するグラフの計算
x = i * 0.01;
y = x*x;



//gnuplotに表示する
fprintf(plotin,"plot '-' title \"oscillation\" \n");
fprintf(plotin,"%f %f\n", x,y);
fprintf(plotin,"e\n");

i++;

}

//gnuplot閉じる
pclose(plotin);

}

A 回答 (3件)

意味がわかりました


次の二つを試してください
1、ループの外に出したfprintfをもどす
2、ループ内の最後にfflush(plotin);を追加する
    • good
    • 0

このようなプログラムでのデバグのこつは、いきなりパイプを使うのではなく


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型にしましょう。

この回答への補足

回答ありがとうございました。

申し訳ありません。
本来のプログラムは余計な情報が色々含まれていたので、質問用に荒削りしたものを乗せた所、色々と不具合のあるプログラムになってました。

お二方からご指摘いただいた部分を修正したプログラムを下記に添付します。

このプログラムを実行した結果、先に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;
}

補足日時:2011/11/12 19:28
    • good
    • 0

forループから、一個目と三個目のfprintfを外に出せばいいと思うよ


と言うかこれじゃグラフ出なくない?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!