C++で簡単にグラフをプロットしよう
matplotlib
を使ってみよう
環境
OS | コンパイラ | python |
---|---|---|
Ubuntu 20.04 | gcc 9.4.0 | Python 3.8 |
さて、やっていこう
ここでは簡単な紹介に留めさせていただく
いくらでも書いてる人はいるからね
さて、ここでは簡単に導入などを説明する
まずは任意のライブラリ用のディレクトリに移動して
$ git clone https://github.com/lava/matiplotlib-cpp.git
終わり
簡単だね
これはヘッダオンリーライブラリだからヘッダをインクルードすればおk
#include<matplotlibcpp.h>
これで使えるようになった
さて、簡単にグラフをプロットしてみよう
// pyplot.cpp #include<matplotlib-cpp/matplotlibcpp.h> #include<vector> namespace plt = matplotlibcpp; int main(){ std::vector<int> x(100), y(100); for(int i = 0; i < x.size(); i++){ x.at(i) = i; y.at(i) = x.at(i)*x.at(i); } plt::plot(x, y); plt::save("./target.png"); return 0; }
こんな感じになる
ちなみにコンパイルするときは
$ g++ -c pyplot.cpp -lpython3.8 -I/usr/include/python3.8 -I ~/project/includes/ $ g++ pyplot.o -o pyplot -lpython3.8 -I/usr/include/python3.8 -I ~/project/includes/
makefileだと
TARGET = pyplot CC = g++ CFLAGS = -O2 -std=c++2a -Wall SRCS = pyplot.cpp OBJS = $(SRCS:%.cpp=%.o) INC = -I/usr/include/python3.8 -I ~/project/includes/ LIB = -lpython3.8 .PHONY: all clean all:$(TARGET) $(TARGET):$(OBJS) $(CC) $^ -o $@ $(LIB) $(CFLAGS) $(INC) .cpp.o: $(CC) -c $^ $(LIB) $(INC) $(CFLAGS) clean: rm -f *.o pyplot
-lpython3.8
というように静的なファイルをリンクする必要がある
自分の手元のpythonのバージョンを確認しましょう
クローンもとのリポジトリではpython2.7を使ってるけどまぁpython3.8でいけたので大体どのバージョンでもいけるだろう
matplotlibの機能は他にもあるので調べてみてもいいだろう
予告: Serial Portの入力をプロットできるようにするのでお楽しみに
わからないことを解決する~継承とクラステンプレート~
さて、あるクラスで別のクラスを使おうとしました。その時に使うクラスがわかっていないのでクラステンプレートを使うほかありません。
template<class T>
class I_SpeedChange{
~~省略~~
};
class proportional : private I_SpeedChange{
~~省略~~
};
これでコンパイルすると
クラス テンプレート "base" の引数リストがありません
と、言われてしまいました
これは困ったぞ……
いろいろ調べた結果、クラステンプレートはクラスに対してテンプレートTを提供するとのこと
つまり……
template<class T>
class base{
~~省略~~
};
template<class T>
class derived : private base{
~~省略~
};
テンプレートお前めんどくさいな
テンプレートの作用するスコープがどこの範囲かって言われたらそうなんだけどね
継承先でもテンプレート書かなきゃいけないのめんどくさすぎ……
じゃあここに親クラスの変数を呼び出してみよう
って思っていたのですが……
できないんですよこれが
色々調べた結果このサイトが見つかりました
にゃるほど~
関数つくってthis
で解決するかbase<T>::
で解決するのがいいのか
じゃあ孫クラスに継承してみようということで(菱形継承、ダイヤモンド継承)
template<class T>
class base{
~~省略~~
};
template<class T>
class derived : virtual public base{
~~省略~
};
template<class>
class derivedX : public derivedA{
~~省略~~
};
baseのサブクラスを一つしか書いていませんがいずれ増やす予定なので仮想継承しています
これで孫クラスから基底クラスへのアクセスも可能です(少なくともコンパイラ上は)
ようやくクラステンプレート解決しました
むぅ、つかれたのでちょっと休憩したいと思います
読んでいただきありがとうございました
Windows用のアプリケーションを作る ~初歩~
初めての投稿です。よろしくお願いします
まず、軽く自己紹介だけしておくと私はロボコンの制御班でプログラムを書いています。
今は忙しくない時期なので趣味を見つけようということでWindowsのアプリを作ってみることにしました
経緯としてはこのくらいです
自己紹介もほどほどにして本題に入りましょう
※書いた主は本物の初心者でまったくわかっていない状態のため説明がほとんどなされていませんが気にしたら負けです
先に言っておきますが、敷居は高いです
その理由は覚えることがひとえに多いからです
その上、コード自体の意味を理解するのにそれなりの時間を要するのである程度覚悟を持って臨みましょう
開発環境
- Microsoft Visual Stadio
言語はc++です
早速コードを見ていきましょう
見るのはこちらのサイトですね
自分でコードを書けないのはとてもおかしいとは思うのですが、それ以前の問題です
shizenkarasuzon.hatenablog.com
これがすべての基礎となっているようです
これをもとにしてアプリケーション開発を進めていくということになるようです
それぞれの変数などの意味はこのサイトが一番詳しいと思います
ここまで他サイトさんに説明を全部投げていますが、主の知識が圧倒的に不足しているだけです。ごめんなさい
さて、リンクをに目を通していただけたでしょうか
これを読んですぐ理解できたという人はおそらく才能にあふれているのでそのまま頑張ってください
わからなかったという人は大丈夫です。私もそうでした。私と一緒に勉強していきましょう
最終的な目標はとあるおふねのブラウザゲーの専用ブラウザを作ることですね
気長に頑張っていきましょう