ラベル boost の投稿を表示しています。 すべての投稿を表示
ラベル boost の投稿を表示しています。 すべての投稿を表示

2010年10月20日水曜日

2010年10月19日火曜日

Boost.Pythonのデバッグ

メモのみ

gdb --args python [./test.py]
C++のクラスをpythonにさらしてインタープリターからコントロールしようとすると
Segmentation fault
同じライブラリでC++のアプリから同じ手順で動かすと動く。
それもある特定のオブジェクトを使ったときだけ…不思議じゃ。
Boost PythonとBoost serializationの相性か?
boost-1.44 
Ubuntu10.04
GCC-4.4.3
python 2.6.5
 
追記10/22
どうも根が深いみたい。ここ 
gdb --args python ./test.py
だと
Program received signal SIGSEGV, Segmentation fault.
0xb5010c17 in __cxa_allocate_exception () from /usr/lib/libstdc++.so.6
LD_PRELOAD="libGL.so libstdc++.so.6" gdb --args python ./test.py
だと
Traceback (most recent call last):
  File "./test.py", line 16, in <module>
    lst.save("./test.xml")
RuntimeError: unregistered class - derived class not registered or exported

Program exited with code 01.

2010年7月8日木曜日

Boost Pythonで複数の返却値

std::pair getWidthHeight(void)なんて関数をpythonにラップするときはここに出ている。
関数を定義して
template
struct PairToTupleConverter {
  static PyObject* convert(const std::pair& pair) {
    return incref(make_tuple(pair.first, pair.second).ptr());
  }
};
登録
to_python_converter, PairToTupleConverter >(); 
std::pairをtupleで返してくれる。

2010年7月6日火曜日

boost_1_43でerror: conflicting declaration ‘mpl_assertion

BOOST_CLASS_VERSIONが ”error: conflicting declaration ‘mpl_assertion”と吐いて終了する。GCC4.4.3
ここ?boost_1_42に戻す。

2010年3月17日水曜日

boost unitsがおもしろい2

でradianとdegreeの変換

   boost::units::quantity theta=3.14159*boost::units::si::radians;
    boost::units::quantity deg=180.0*boost::units::degree::degrees;

    std::cout << "radian = " << theta << std::endl;
    std::cout << "degree = " << deg << std::endl;

    std::cout << std::endl;

    std::cout << "conversion " << std::endl;
    std::cout << "3.14159 radian = " << boost::units::quantity(theta)<< std::endl;
    std::cout << "180 degree = " << boost::units::quantity(deg) << std::endl;


出力は
radian = 3.14159 rad
degree = 180 deg

conversion
3.14159 radian = 180 deg
180 degree = 3.14159 rad

しかしコンパイルに時間かかるな。

boost unitsがおもしろい

こちらを見て 角度のradian, degreeの変換を調べようとしたらひっかかてしまった。

F  = 2 N
dx = 2 m
E  = 4 J

V   = (12.5,0) V
I   = (3,4) A
Z   = (1.5,-2) Ohm
I*Z = (12.5,0) V
I*Z == V? true

ソースはこちら、

boostでπ(M_PI)

math.hぢゃあなくてやりたいとすると。
Math Toolkitを使えば、
ライブラリリストからMath->Statistical Distributions->Internal Details and Tools (Experimental)->Numeric Constants

#include <boost/math/constants/constants.hpp>
pi=boost::math::constants::pi<double>()

1)まあ Experimentalと書いてあるがいいとしよう。
2)タイトル(Math Toolkit)がなかなかMathライブラリの中に見つからなかったぞ。統一してほしいぞ。

2010年3月10日水曜日

BOOST_CHECK_CLOSEのtolerance_srcは%!

  v=1.0;
  BOOST_CHECK_CLOSE( v, 1.3, 20.0);
  BOOST_CHECK_CLOSE( v, 1.3, 30.0);
  BOOST_CHECK_CLOSE( v, 1.3, 40.0);

test.cpp(64): error in "interpolate": difference{23.0769%} between v{1} and 1.3{1.3} exceeds 20%
test.cpp(65): error in "interpolate": difference{30%} between v{1} and 1.3{1.3} exceeds 30%

2010年2月4日木曜日

boost 1.42.0をMSVC2005

.\bjam.exe --build-type=completeを忘れない。
FindBoost.cmakeのversionも忘れずに。

2009年11月13日金曜日

undefined symbol error

undefined symbolがでたら、ライブラリにクラスを追加忘れていないか注意しよう。

2009年10月28日水曜日

Boost Python VC++

cmakeでboost pythonを使うとき、
find_package( Boost COMPONENTS python ... )
とやるとVC++ではリンクできないとわめく。
set(Boost_USE_STATIC_LIBS   OFF)
add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINTIIONS})
としておくとやめる。
 
しかし、開発中のものでVC++ではエラーが出ないがgcc on UbuntuでコンパイルしたBoost Pythonが動かない。
Python argument types in .... did not match C++ signature: .... と出やがる。 
 
追記:pythonをリンクさせることを忘れていました。トホホ 

2009年8月25日火曜日

Boost::Pythonでshared_ptrを使う術

Boost::Pythonでshared_ptrを使うには、先に宣言しよう。
BOOST_PYTHON_MODULE(gaga)
{
boost::python::register_ptr_to_python<boost::shared_ptr >();
boost::python::class_("gigi")
.def("gugu", &gugu)
;
...
...
}

2009年8月22日土曜日

Boost::Python

Boost::Pythonはソースに手を入れなければならないと思われているがそんなことはない。サンプルがそのようであるからで、実際にはヘッダーファイルをインクルードしたラッパーを書けば1丁上がりである。元になるライブラリがDLLならラッパーだけのDLLができてライブラリのDLLを読みに行ってくれる。すなわち軽量。しかもラッパーはC++のソースだからわかりやすい。Python以外のLLにポートしないのならSwigよりおすすめです。

2009年8月20日木曜日

Boost::Pythonに泣く

pythonの拡張をC++でしようと思ってubuntuでやっていたことをVC++に持っていくとpython25.dllがないと怒られた。そんなもん使ってないのになんでいるんだとしばらく毒づいていた。
ふと気づいて、dependencywalkerで見てみると、なんとboost::pythonのライブラリが依存していた。そうそう、このライブラリ構築したのはpython25のときでした。「スマンカッタ。」
そこでboostライブラリの再構築。しかし時間かかるなーあ。complete指定だと優に1時間かかったが、こんどはエラー吐かなくなった。目出度しめでたし。

2009年7月14日火曜日

BOOST_PP_SEQ_ELEM_III error

これもしばらく苦しんだのでメモ
"BOOST_PP_SEQ_ELEM_III" requires 2 arguments, but only 1 given とでたら、
BOOST_PP_SEQ_ELEMを遅延評価に。
BOOST Archives
参照

2009年7月11日土曜日

boost::preprocessor nested seq

しばらく苦しんだのでメモ。
boost::preprocessorで入れ子のコンテナ例えばシーケンスのシーケンスを処理するとき同じマクロを2度使えない。
#define SEQ ((Red)(Blue))((Blue)(Red))((Black)(White))((While)(Black))
を処理しようとすると、
○
#define INNER_MACRO(r, data, i, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH_I(INNER_MACRO, _, elem)

BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)
×
#define INNER_MACRO(r, data, elem) BOOST_PP_CAT(elem, data)
#define OUTER_SEQ(r, data, elem) \
BOOST_PP_SEQ_FOR_EACH(INNER_MACRO, _, elem)

BOOST_PP_SEQ_FOR_EACH(OUTER_SEQ, _, SEQ)

VC++で確認するには
cl /EP/ /I c:\Boost\include\boost-1_39 .\test.h
おまじない
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
も忘れないように。

追記:IDEからはプロジェクトのプロパティ->プリプロセッサ->前処理済みのファイル生成=>行番号なし、で確認できる。

2009年5月19日火曜日

boostインストールで嵌まる。

「嵌まる。」多いな最近。
boost_1_39_0をUnixにinstallしようとコンパイルしたところ、localにprefixを設定したはずなのにインストールしてくれない。
結論、bootstrap.shのbug、252行の
251: if test "x$LIBDIR" = x; then
252: LIBDIR="$EXPREFIX/lib"
253: fi
て、
252: LIBDIR="$EPREFIX/lib"
でしょうが。

2009年4月14日火曜日

boost::shared_ptrをキャスト

boost::shared_ptrをキャストするときは
boost::shared_polymorphic_castを使おう
boost::shared_dynamic_castは、キャストが失敗した時に例外を投げない。

と書いていたが、boost::shared_polymorphic_castは非標準らしい。
ラッパーを書くのがベター。boost