2015年3月12日木曜日

C++の勉強とSTLをマウスで使おうとしたが使えなかった話

どうもです.  最近はマウス関係のプログラムばかりしているような気がします.


唐突ですが, 今C++の勉強をしています.  自分はあまりプログラムはバリバリ書く方ではありませんし, 一応Cとjavaは少しわかりますがマウスを動かすのに必要な最小限の知識くらいしかありません.  なので, 勉強がてらにC++でキレイにマウスのプログラムを書いてみようという感じです.

C++で書くといいかなと思ったもう一つの理由として, マウスのプログラム開発用に作っているソフトをC++で書いているからというのもあります.

C++で開発するメリットと言えばSTLやBoostの存在が一番にあげられます.  Cでコードを書くとどうしてもスタックやキュー, 線形リストなどの実装を何度もせねばならずコードが汚くなります.  そこで, マウスでもSTLを使おうと思っていろいろ頑張ってみました.

が, 結局使えませんでした...

まあ, でもやったことはブログに書いておこうと思います.
//////////////////////////
開発環境 e2studio
マイコン ルネサスのRX631
//////////////////////////
まず, ルネサスのサイトで情報を収集したところ
http://japan.renesas.com/products/tools/coding_tools/compilers_assemblers/Application_Notes.jsp
アプリケーションノートにSTLライブラリの導入方法のドキュメントとSTLライブラリのソースコードを
発見しました.





このドキュメントはHEWでの設定の方法しか書いていないですが, 設定と言ってもダウンロードしたファイルを解凍してインクルードディレクトリのパスに追加するだけなのでe2studioでも同じことをします.
上にあるプロジェクトのプロパティをクリックし↑のようにたどるとインクルードディレクトリを追加できます.

これで, ソースファイルに#include <vector>と追加してコンパイルをしてみたところどうもエラーが
でます.  どうもダウンロードしてきたソース内の_cstddef.h等の複数のヘッダファイルないの

#      include _STLP_NATIVE_CPP_C_HEADER(cstddef)

という部分が原因のようなので試しにこの記述をすべてコメントアウトしました.  するとコンパイルは通るようになって

#include <vector>
using namespace::std

std::vector<int> v;
と記述してもコンパイルはとおります.
しかし, vectorのpush_back()を使うとコンパイルエラーになってしまいました...


v.push_back(1);  //コンパイルエラー

これで, 結構いろいろ頑張ってみてもちゃんとvectorが使えなかったのでe2studioではなくてCS+(Cube suite+??)をダウンロードしてきてSTLを同様にインクルードディレクトリに入れたところ

#      include _STLP_NATIVE_CPP_C_HEADER(cstddef)

ではコンパイルエラーをはかず, いけたかなと思ったのですが, 結局vectorのpush_back()は使えませんでした.  しかし, push_back()以外の他の関数やstackは使えるようです??

#include <vector>
#include <stack>
using namespace std;


void main(void)
{
std::vector<float> hoge;       //コンパイル通る
hoge.push_back(1.0);           //コンパイル通らない
   
std::stack<float> hogehoge; //コンパイル通る
hogehoge.push(1.0);            //コンパイル通る
}

いろいろ調べるとiostreamが既存のものとSTLportのもので競合しているのが原因??
かなというところまではわかったのですが, なんか面倒くさいので結局STLの機能のうち必要なものを勉強がてらにTemplateで実装することにしました.

ふう, 疲れましたね.





2 件のコメント:

  1. 同じことに挑戦しており,非常に参考になりました.
    push_backを使えましたので,参考までに取り組んだことを残しておきます.

    プロジェクト作成時に自動生成される
    lowlvl.src
    lowsrc.c
    をプロジェクトに追加することで無事ビルドがとおり,また使用できました.

    プロジェクトはc++用のrx631(r5f5631fddfp)を対象とし,cs+です.
    コードは下記のとおりです.

    //#include "typedefine.h"
    #ifdef __cplusplus
    //#include // Remove the comment when you use ios
    //_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios
    #endif

    #include

    #define _ 1

    void main(void);
    #ifdef __cplusplus
    extern "C" {
    void abort(void);
    //#include
    }
    #endif


    float print[6];
    void main(void)
    {
    std::vector vector(3,3);

    for(int i=0;i<5;++i){
    print[i]=vector[i];
    }
    vector[3]=2;
    vector.push_back(5);
    //vector.pop_back();
    for(int i=0;i<5;++i){
    print[i]=vector[i];
    }

    for(;_;){
    ;
    }
    }

    #ifdef __cplusplus
    void abort(void)
    {

    }
    #endif

    返信削除
    返信
    1. 少し古い記事ですが、お役に立てたならばとてもうれしいです。
      また、非常に有益な情報を教えていただきましてありがとうございます。

      この記事の執筆当時はルネサス純正のコンパイラでSTLを使おうと頑張っていましたが、今はKPITから提供されているコンパイラを用いてe2studioで開発をしています。(STLも問題なく動作しています。)

      ルネサス関係の情報でコンパイラ周りの話はあまり情報が見つからないので、試行錯誤に時間がかかってしまうのが苦しいですよね。ですので、コメントに書いていただいたような情報で救われる人がどこかにいると思うのでできるだけ、インターネットの片隅に情報を置くようにしていきたいですね。

      削除