nagaのプログラム備忘録

自分のぶつかったことや学んだことについて書き残します

~やりたいことのごった煮~

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;
}

f:id:karupi_neko:20220312000450p:plain
xの2乗に比例

こんな感じになる

ちなみにコンパイルするときは

$ 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{
~~省略~
};

 

テンプレートお前めんどくさいな

テンプレートの作用するスコープがどこの範囲かって言われたらそうなんだけどね

 

継承先でもテンプレート書かなきゃいけないのめんどくさすぎ……

じゃあここに親クラスの変数を呼び出してみよう

って思っていたのですが……

できないんですよこれが

 

色々調べた結果このサイトが見つかりました

qiita.com

rpgincpp.cocolog-nifty.com

 

にゃるほど~

関数つくって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のアプリを作ってみることにしました

経緯としてはこのくらいです

自己紹介もほどほどにして本題に入りましょう

※書いた主は本物の初心者でまったくわかっていない状態のため説明がほとんどなされていませんが気にしたら負けです

 

先に言っておきますが、敷居は高いです

その理由は覚えることがひとえに多いからです

その上、コード自体の意味を理解するのにそれなりの時間を要するのである程度覚悟を持って臨みましょう

 

開発環境

言語はc++です

 

早速コードを見ていきましょう

見るのはこちらのサイトですね

自分でコードを書けないのはとてもおかしいとは思うのですが、それ以前の問題です

shizenkarasuzon.hatenablog.com

 

これがすべての基礎となっているようです

これをもとにしてアプリケーション開発を進めていくということになるようです

 

それぞれの変数などの意味はこのサイトが一番詳しいと思います

fenix-pc.blog.jp

ここまで他サイトさんに説明を全部投げていますが、主の知識が圧倒的に不足しているだけです。ごめんなさい

 

さて、リンクをに目を通していただけたでしょうか

これを読んですぐ理解できたという人はおそらく才能にあふれているのでそのまま頑張ってください

わからなかったという人は大丈夫です。私もそうでした。私と一緒に勉強していきましょう

 

最終的な目標はとあるおふねのブラウザゲーの専用ブラウザを作ることですね

気長に頑張っていきましょう