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

2009年2月28日土曜日

swig boost_random クリア!

 全部、クリアしました。という訳で、再度、告知します。


 gcc の typeinfo が返すアホな名前ですが、最終的には、std::map<std::string,std::string> によりマッピングを作成しておいて正しい名前に変換するという手法でクリアしました。これなら、どのコンパイラもクリアだと思いたい。

 cmake の TRY_RUN の挙動ですが、コンパイラ・オプションは別途指定しなければならないようです。"-I /usr/local/include/boost_1_38" というような追加情報は、COMPILE_DEFINITIONS に指定しなければなりませんでした。windows 上では環境変数 include に boost も指定していたので windows 上のみ作動していたという訳でした。

追伸:
 ツンデレのお題、俺、体育会系だし、わかんねーよ(Don't think, type. by BRUCE LEE 2nd)。
と思っていたのですが、typeid の返す名前をツンして、
  • gcc : typename コンバータ使ってね
  • msvc : 完璧ね
とデレするパターンを朝に閃きました。でも、こっちに夢中で時間切れとなりますた。

2009年2月14日土曜日

swig ってどうよ?

 ちょい突っ込んでみたが、何も全部をそのまま移植しようとしなくても良かろうに…と思うのである。%ignore により、こいつは無視してくだされ…という指定もできるのだが、ラッパーをかまそうと思ってもできない。これについては、後述する。

 だいたい、ruby のサンプルに template はあるのに、perl のサンプルに template はない。無理矢理移植をしてコンパイルしてみたが、なるほど、コンパイルが通らない。C2061 とか出てて、検索してみたら、2ch にも投稿があり、先駆者の屍が累々としていそうである。だいたい、現行 C++ の template をスクリプトにそのまま展開しようというのは狂気の沙汰であるようにも思える。

 %ignore で無視できるメンバを指定できるのに加えて、#include <hoge.hpp> の中身全てを無視するディレクティブ(指令)が欲しいところである。最終的には、sizeof(無視されたメンバ) さえ取得できれば辻褄が合うのではないかと思う(確信は無い)。

 で、ためしに boost::mt19937 のメンバを char dummy[4]; ぐらいで置き換えて、コンパイルしてみたら、実行時に見事にお亡くなりになる。


#include <boost/random.hpp>
#include <iostream>

int main() {
std::cout << sizeof(boost::mt19937) << std::endl;
return 0;
}


を実行してみると、4996 と表示された…。そんなにデカかったのかよorz...(そりゃそうか)。
気を取り直して、char dummy[4996]; で再度実行すると、うまく動いているような気がする(ただし、表示される数値は unsigned のレンジではなく signed のレンジで怪しさ倍増)。うーん…、swig ってどうよ?

2009年2月13日金曜日

swigってみた

 なんとなく swig
どの言語を対象にしても良いけれでも、一応メジャーな Perl にしてみた。今回は windows で、ちょい試してみたので、swig は swigwin-1.3.38 をチョイス。
 cygwin は、どうも好きになれないのと、ActivePerl で swig できるらしいので、ActivePerl 5.10 をダウンロードしてインストール。ここから、ややしばらく悩んだ…。
 swigwin-1.3.38\Examples\perl5\simple のIDEを開いて、コンパイルしてみると、PERL5_INCLUDE, PERL5_LIB の環境変数が設定されていないと怒られ、EXTERN.h とかが無いと言われる。そんなもん、どこにあんねん?とディレクトリを見たが、それらしい所が無い、検索しても、どこにあるといった情報が皆無。ディレクトリを検索してみて、ようやく見つけた。

PERL5_INCLUDE=C:\Perl\lib\CORE
PERL5_LIB=C:\Perl\lib\CORE\perl510.lib

を設定し、コンパイル。OK、うまくいった。

C:\downloads\swigwin-1.3.38\Examples\perl5\simple>perl runme.pl
The gcd of 42 and 105 is 21
Foo = 3
Foo = 3.1415926

ちゃんと動いているようだ。