2005年07月
いい加減に頭にきたかなぁ
- 2005-07-26 (Tue)
- プログラミング
数々のエラーを回避してようやくシンタックスの正しいコードを作れたと思ったらコンパイラが最終フェーズで segment violation とか言って落ちる始末… 無理でしょ,このコンパイラでプログラム書くの.おとなしく金を払ったほうがいい気がしてきた今日この頃.
- Comments: 0
- TrackBack (Close): -
STL の一部を自作せよ
コンパイラが SGI の STL を満足にコンパイルできないのでしょうがなく string, pair, vector を自分で実装することに.vector は面倒なので arraylist にして実装,サイズは倍々にしか大きくなりません.string は char* のラッパクラスで pair はただのペアと.はじめからこうしておいたほうが速かったと本気で思う今日この頃.とはいえ,まだまだテンプレート周りでエラーでまくりだなぁ.
- Comments: 0
- TrackBack (Close): -
STL のコンパイルを目指して
あほなコンパイラで SGI の STL をコンパイルしようと奮闘中.static_cast が無いから手前で用意してみたり,関数ポインタを返す関数がうまく解釈されないのでいろいろ書き方を変えてみたり.しまいにゃ「この関数使ってないから消してしまえ」で消しまくってみたり.いろいろやってみたけど何となくコンパイルは無理な気がしてきた…
- Comments: 0
- TrackBack (Close): -
Template で覆面算
覆面算のすべての条件分岐を Template で処理してしまうプログラムを考えた.ソースを書くのが面倒なのでソースジェネレータを書いて生成することに.とりあえず,ジェネレータとできたソースをおいておくとして… Pen4 2.6C で8時間たってもコンパイルが終わらない… メモリもすでに 1G 食ってるし.このソースをコンパイルできる環境ってどこかにあるのだろうか? ちなみに,X*Y = ZZ という 4 進数での覆面算のプログラムは以下のとおり(答えなし)
#include <iostream> using namespace std; template <bool judge, typename T, typename F> struct Selector{ typedef T val; }; template <typename T, typename F> struct Selector<false, T, F>{ typedef F val; }; struct Nothing{ inline static void calc(){}}; template<unsigned int x, unsigned int y> struct Printer{ inline static void calc(){ cout << x << " * " << y << " = " << x * y << endl; cout << y << " * " << x << " = " << x * y << endl; } }; template<int x0, int y0> struct Judge{ const static bool val = ((x0==y0))&&((x0==y0))&& (x0!=0);}; template<int n, unsigned int x, unsigned int y, int x0, int x1, int x2, int x3> struct Perms{ inline static void calc(){}}; template<unsigned int x, unsigned int y, int x0, int x1, int x2, int x3> struct Perms<0, x, y, x0, x1, x2, x3>{ inline static void calc(){ Selector<true, Perms<1, x | (x0<< 0), y, x0, x1, x2, x3>, Nothing >::val::calc(); Selector<true, Perms<1, x | (x1<< 0), y, x1, x0, x2, x3>, Nothing >::val::calc(); Selector<true, Perms<1, x | (x2<< 0), y, x2, x1, x0, x3>, Nothing >::val::calc(); Selector<true, Perms<1, x | (x3<< 0), y, x3, x1, x2, x0>, Nothing >::val::calc(); } }; template<unsigned int x, unsigned int y, int x0, int x1, int x2, int x3> struct Perms<1, x, y, x0, x1, x2, x3>{ inline static void calc(){ Selector<(x0 > x1), Perms<2, x, y | (x1 << 0), x0, x1, x2, x3>, Nothing >::val::calc(); Selector<(x0 > x2), Perms<2, x, y | (x2 << 0), x0, x2, x1, x3>, Nothing >::val::calc(); Selector<(x0 > x3), Perms<2, x, y | (x3 << 0), x0, x3, x2, x1>, Nothing >::val::calc(); } }; template<unsigned int x, unsigned int y, int x0, int x1, int x2, int x3> struct Perms<2, x, y, x0, x1, x2, x3>{ inline static void calc(){ Selector<(((x*y) >> 0)& 0x3) == x2, Perms<3, x, y, x0, x1, x2, x3>, Nothing >::val::calc(); Selector<(((x*y) >> 0)& 0x3) == x3, Perms<3, x, y, x0, x1, x3, x2>, Nothing >::val::calc(); } }; template<unsigned int x, unsigned int y, int x0, int x1, int x2, int x3> struct Perms<3, x, y, x0, x1, x2, x3>{ inline static void calc(){ Selector<Judge<(((x*y)>>2)&0x3), x3>::val, Printer<x,y>,Nothing>::val::calc(); } }; int main(int argc, char *argv[]) { cout << hex; Perms< 0, 0, 0, 0, 1, 2, 3>::calc(); }
- Comments: 0
- TrackBack (Close): -
Template でPermutation前計算
順列を生成して出力するプログラムをかんがえる.んで,コンパイル時に順列を全生成して,その結果のみを出力するプログラムが最速である.なので,Template で順列を全生成して出力するプログラムを作ってみた.
とりあえず,ソースジェネレータと作られたソースをおいてみる… コンパイルが激遅い… ちなみに,生成された 3 の permutation のコードはこんなもん.
#include <iostream> using namespace std; template<int n, int x0, int x1, int x2> struct Perms{ inline static void calc(){} }; template<int x0, int x1, int x2> struct Perms<0, x0, x1, x2>{ inline static void calc(){ Perms<1, x0, x1, x2>::calc(); Perms<1, x1, x0, x2>::calc(); Perms<1, x2, x1, x0>::calc(); } }; template<int x0, int x1, int x2> struct Perms<1, x0, x1, x2>{ inline static void calc(){ Perms<2, x0, x1, x2>::calc(); Perms<2, x0, x2, x1>::calc(); } }; template<int x0, int x1, int x2> struct Perms<2, x0, x1, x2>{ inline static void calc(){ Perms<3, x0, x1, x2>::calc(); } }; template<int x0, int x1, int x2> struct Perms<3, x0, x1, x2>{ inline static void calc(){ cout << x0 << x1 << x2<<endl; } }; int main(int argc, char *argv[]) { cout << hex; Perms< 0, 0, 1, 2>::calc(); }
- Comments: 0
- TrackBack (Close): -
Template で条件分岐
Template でプログラム中の条件分岐を全てやってしまうことはできないだろうか? 最近こんなことを考えていたのだが,if 文だけなら何とかなるなぁと思ってみた.各処理ブロックをTemplate にして,必要な変数を全て Template 引数にして,条件分岐に Selector を使って条件に応じて適した Template クラスの calc() メソッドを呼ばせると.このとき,else 節がいらない場合には, Nothing という何もしない Template を使うと.たとえば,x が y より小さいときだけ出力する場合には,こんなかたちでできるはず.
template <bool judge, typename T, typename F> struct Selector{ typedef T val; }; template <typename T, typename F> struct Selector<false, T, F>{ typedef F val; }; struct Nothing{ inline static void calc(){}}; template<unsigned int x, unsigned int y> struct Printer{ inline static void calc(){ cout << x << " < " << y << endl; } }; template<unsigned int x, unsigned int y> struct MinThenPrint<x, y >{ inline static void calc(){ Selector<(x < y), Printer<x,y>,Nothing>::val::calc(); } };
- Comments: 0
- TrackBack (Close): -
TeX で書いた式を画像に落とす
TexPoint でやっていることをスクリプトにまとめてみた.tex2img.tex で画像に落としたい式とかを書いて下のスクリプトを実行するれば,tex -> dvi -> ps -> bmp(png) と画像が出来上がるという仕組み.pLaTeX, Ghostscript が必要になる.
#!/bin/bash BASE="tex2img" TEXFILE="$BASE.tex" DVIFILE="$BASE.dvi" PSFILE="$BASE.ps" BBFILE="$BASE.bb" RES="1200" #DEVICE="pngmono" #OUTFILE="$BASE.png" DEVICE="bmpmono" OUTFILE="$BASE.bmp" TEXCOM="platex $TEXFILE" PSCOM="dvipsk -D $RES -E -o $PSFILE $DVIFILE" BBCOM="gswin32c -q -dNOPAUSE -dBATCH -sDEVICE=bbox $PSFILE" echo "Running $TEXCOM" $TEXCOM echo "Running $PSCOM" $PSCOM echo "Running $BBCOM" $BBCOM > $BBFILE 2>&1 BB=`cat $BBFILE | grep '%%BoundingBox:'` echo "Found bounding box $BB" BX=`echo $BB | awk '//{print $2}'` BY=`echo $BB | awk '//{print $3}'` BX2=`echo $BB | awk '//{print $4}'` BY2=`echo $BB | awk '//{print $5}'` X=`expr $BX2 '-' $BX` X=`expr $X '*' 300` X=`expr $X '/' 18` Y=`expr $BY2 '-' $BY` Y=`expr $Y '*' 300` Y=`expr $Y '/' 18` IMGCOM="gswin32c -q -dNOPAUSE -dBATCH -sDEVICE=$DEVICE -r$RES -sOutputFile=$OUTFILE -g${X}x${Y} -c -$BX -$BY translate -q $PSFILE" echo "Running $IMGCOM" $IMGCOM
ファイルにして置いておこう.
- Comments: 0
- TrackBack (Close): -
テンプレート版の if
テンプレートでプログラムするための部品として if に相当する Select なるものがある.これを使うと then 節と else 節の一方のみの評価ができるので安全.ためしに Collatz 予想のやつで遊んでみた.
template<bool, typename T, typename F> struct Select{ typedef T val; }; template<typename T, typename F> struct Select<false, T, F>{ typedef F val; }; template <int n> struct Collatz { const static int val = Select<(n&1)==0, Collatz<n/2>, Collatz<3*n+1> >::val::val + 1; }; template <> struct Collatz<1> { const static int val = 0; }; int main(int argc, char *argv[]) { cout << Collatz<3>::val << endl; return 0; }
- Comments: 0
- TrackBack (Close): -