[[Hirofumi Fujii Start Page]] * gnuplot の iostream 化 [#z45e6c91] C++ 入門の題材 search その何番目かわからなくなったが、、 徒然なるままに、 ひぐらし画面に向かいて、、 というわけで(どういうわけだ?)、一つの案として - 入門 program として乱数発生(rand() を使う)。これは生データの 代わり。将来シミュレーションにも使える。 - 乱数発生を関数化、関数と namespace の導入 - 乱数分布を調べるのに(1次元) histogram を struct で導入、 メモリの動的確保と pointer の導入 - histogram の class 化、copy constructor 、代入演算子の重要性 - histogram class の出力演算子の作成。この時、gnuplot の ostream class 化が 成されていると、とても美しいような気がする、、 で、gnuplot の iostream 化(というかとりあえず ostream 化) - gnuplot の起動と制御は popen() で行う。 - popen() に該当する pstream class の標準があれば、それを使おうかと思った のだが、どうも無さそう(boost にはあるかも、でも boost を導入するほどのもの ではないだろう)。 - gnuplot に特化するなら、streambuf と ostream から派生させる方が楽そう。 constructor でいきなり popen してもよいだろうし。 -- streambuf から gplbuf を派生。 -- gplbuf には open()/close() を持たせ、ここで popen()/pclose()。 -- ogplstream(ognuplot という名前の方がいいかな?)は gplbuf 使って、 通常の ostream の作成法で作る。 何となく簡単にいけそうな気がしてきた。後でやってみよう。 ** 結果 [#lb4d8555] 何となくできた。しかし、デバッグも含め 3時間もかかってしまった。疲れたので source 載せるのやめ(急ぎの希望者は藤井宛電子メールでも、、Hirofumi.Fujii に @kek.jp をつける)。 source 載せるのやめ(急ぎの希望者は藤井宛電子メールで、、Hirofumi.Fujii に @kek.jp をつける。でも居るのか?)。 まあ、結構おもしろいかも。 mylibrary::ognuplot gpl("gnuplot"); : gpl << "plot sin(x)" << std::endl; なんてやると絵が出る。 - class名は ognuplot にした。 - std::ostream から派生。従って、出力規則も std::ostream のルールだし 例外制御も std::ostream のルール。 - 上記例のように実行ファイル名を与えて construct すると、その時点で popen() 接続。 - 引数無しの constructor で生成した時は、後で open() 関数を呼び出すことで popen() 接続。 - close() は用意してあるが、特に呼び出さなくても destruct された時点で open されていれば自動で close()。