C++

Open Motion Planning Library の解説と演習

Open Motion Planning Library (OMPL) という,オープンソースのモーションプラニングライブラリの導入テキストと演習問題集を書いた.OMPL.app の部分はTavo君が手伝ってくれた.

ODE で tri-mesh を使うときはデータの解放を忘れずに

C++

ODE (Open Dynamics Engine) で tri-mesh (三角形メッシュ) を使うとき,dGeomTriMeshDataCreate で確保したデータを,dGeomTriMeshDataDestroy で破棄するのを忘れてはならない.破棄しなければ,メモリリークの原因となる(特に,シミュレーションのリセッ…

意外に簡単! LinuxでジョイスティックをC++から使う方法

デバイスをオープンし,ちょっとした設定のあと,Linuxで提供されている js_event 構造体に読みこむだけ.Cでも同様.PlayStation 2/3用のコントローラをUSB接続したものでも使えた. 参考: joystick tutorial and code

変数の初期化をサボるな,それから -Wshadow オプションを使え

という自戒.前にも似たような話を書いたのだが,懲りずにまたやった. 今回は,未初期化の変数と未発見のバグを含んだプログラムを使っていて,まったく関係のないコードを加えたタイミングで変数の初期値変動によってバグが顕在化した場合に,新しく加えた…

imshow で表示しても waitKey を使わないとウィンドウは描画されない

ということを今まで知らずに使ってた.User Interface - OpenCV v2.4.2 documentation#waitKey によると: This function is the only method in HighGUI that can fetch and handle events, so it needs to be called periodically for normal event proces…

ODEのインストール時にグラフィック(X11)で問題が起きる場合は

ODE (Open Dynamics Engine) を Linux (ここでは Ubuntu) にインストールするときに,以下のようなエラーが出る場合の対処法. x11.cpp:108: error: undefined reference to 'XOpenDisplay' x11.cpp:123: error: undefined reference to 'XCreateColormap' .…

std::vectorの要素の参照型はbool&ではない(場合がある)

std::vector::back() を使うと,末尾の要素の参照を取得できる.これは普通は,T&型だ.ところが,T=bool に限っては,「std::_Bit_reference」型なのだ(少なくとも g++ の場合). 通常,bool を関数の引数として渡すとき,わざわざ参照渡ししようとは思わ…

テンプレートメンバ関数の特殊化はクラス外で

クラスのメンバ関数をテンプレート関数として作成し,さらにそれを特殊化する場合,特殊化は,特殊化宣言も含めてクラス外で行わなければならないらしい.

Microsoft kinect SDK を手っ取り早く使ってみるミニマムプログラム 〜スケルトン編〜

Microsoft の kinect SDK をダウンロードしてくると,インストールは簡単だし,Visual Studio でサンプルプログラムを簡単にコンパイルして実行できる.しかし,コードはそれなりに煩雑で(と言っても1000行程度だが),自分でアプリを作る場合にどこから始…

template な friend

テンプレートクラスや関数を friend にする方法のメモ.危険性についても言及.

Ubuntu の 10.10 や 11.04 でシリアル通信ができない

シリアルケーブルをUSBに変換するコネクタを使って,BioloidというROBOTIS社のロボットを,PCで制御する際の問題について.

STL コンテナの前方宣言:軽いヘッダファイルを作るには

STL (standard template library) コンテナを include すると,それなりにコストが掛かる(参考).このコストは,場合によっては「前方宣言 (forward declaration)」によって大幅に軽減できる.STL コンテナの場合,前方宣言が少々ややこしいので,まとめて…

浮動小数点型変数は必ず初期化する

使用する・しないに関わらず,float, double, long double 型の変数は必ず初期化するポリシーで生きることにする.

テンプレートの中でほかのテンプレートクラスのメンバ型を使う方法: typename や template の別の用法について

あるテンプレート関数(テンプレート型引数 T)で,例えば std::vector::iterator itr を定義しようとすると,コンパイルエラーとなる(std::vector::iterator が型であると認識されない).この場合 typename std::vector::iterator itr のように,前に typ…

任意に整数変数を初期化するテンプレートクラス

クラスや構造体のメンバ変数を初期化するには,コンストラクタに初期化リストを書かなければならない.が,宣言場所と離れてしまったり,同じ変数名を2度(宣言と初期化で)書く必要があって面倒くさかったりする.整数変数しか使えないが,メンバ変数を宣言…

テンプレートを汎用的な構造体に対して特殊化するには

template<typename T> function(const T&)のようなテンプレート関数があったとして,この実装を T が構造体の場合は変更したい(部分特殊化したい)とする.特定の構造体に対する特殊化なら話は簡単だが,本記事では汎用的な構造体に対する部分特殊化を扱う.この問題は</typename>…

friend 属性を継承する

C++

C++ では,クラスを継承しても friend 属性は継承されない.継承させたい場合,どうするか?

最近の octave / liboctave インストール

ここ最近の octave / liboctave のインストール方法についてメモ.(Debian / Ubuntu) (追記@Feb.06,2010)共有ライブラリの指定について.

ヘッダファイルの include コストを調べてみた

C++

include するヘッダファイルが多くなればなるほど,コンパイルに掛かる時間が増加する.では,それぞれのヘッダファイルを include するコストはどれくらいなのか?

bash は '-E' を echo できない(?)

echo '-E' とすると,'-E' が echo のオプション(エスケープ文字を解釈しない)として解釈され,echo できない.変数に代入したりしても同じ.しかたないので,C++ で引数を直接出力するプログラムを書いた. (追記@Oct.14,2009)printf -- '-E' とするの…

メンバ関数の部分特殊化がしたい

C++ でメンバ関数を部分特殊化しようとすると(例えばテンプレートクラスのテンプレートメンバ関数を,ある特定の型について特殊化する),コンパイルエラーとなる.gcc なら "error: invalid use of incomplete type" だとか, "error: enclosing class tem…

パイプストリームクラス

gnuplot のようなプログラムには,パイプを使ってほかのプログラムからデータを送ることができる.std::cout などのストリームクラスのように,パイプストリームクラスを作成すると便利そうなので,実装してみた.

operator<<をオーバーロードして任意書式

シリアル通信のプログラムなどでは,多くの場合 unsigned char の配列にデータを保存する.このようなデータを16進数で標準出力に表示する場合, operator<< をオーバーロードすると便利だ.しかし,単純に unsigned char* に対してオーバーロードすると,オ…

コンソールで動くシューティングゲームを作ってみた

眠かったから,ncurses ライブラリを使ってシューティングゲームを作ってみた.10年以上昔,N88-BASICで同じようなプログラムを作ってたのを思いだした.

可変引数リストを使った任意長のベクトル初期化

C/C++ の可変引数リスト (variable argument list) をあまり使ったことがなかったので,練習も兼ねて,初期値付きで任意長のベクトルとかリストを生成できる関数を作る.例えば list<double> x= container_gen<list<double> >(5, -5.0,10.0,3.0,1.0,2.0) のような感じで,サイズ5</list<double></double>…

テンプレートクラスの「特殊化」と「明示的インスタンス生成」を同時に使う場合は注意が必要だ(2)

先日の記事で扱った問題の対処法について.結論:テンプレートクラスの(部分)特殊化を行う場合は,そのテンプレートクラスを宣言しているヘッダファイルで「(部分)特殊化の宣言」を行うこと.部分特殊化の実装は,通常のクラスまたはメンバ関数の実装と同様…

テンプレートクラスの「特殊化」と「明示的インスタンス生成」を同時に使う場合は注意が必要だ

テンプレート関数の明示的インスタンス生成で解説したように,テンプレートクラスとかテンプレート関数を明示的にインスタンス化しておくことで, ヘッダファイルの肥大化(コンパイル速度の低下) 望ましくない実装の公開 といった問題を避けられる.一方,…

名前空間 A と名前空間 B::A は共存できるか?

ちょっとした実験. namespace A {...} namespace B { namespace A {...} ... } のように,既に存在している名前空間 A と同じ識別子の名前空間を,別の名前空間 B の中に作ることはできるか? また,作られた場合どうやってアクセスするのか? を調べる.

inline 関数を使用場所より後で定義してもいいか?

すぐ忘れるので,メモ. inline 関数は,先行宣言しておくことで,定義が使用場所より後にある場合でも問題なく使える.

テンプレートの部分特殊化を利用した const 除去型 〜boost のソースを読む〜

過去記事「テンプレートの部分特殊化を利用した間接参照型推定」では,テンプレートのテンプレートの部分特殊化 (Wikipedia)を使ってポインタ型やイテレータ型からそれを間接参照した型(ポインタを取った型)を推定する方法を紹介した.この方法を使って,…