2008年5月4日日曜日

stringstreamについて

C++では stringstream は非推奨。
sstreamをインクルード。

出力にはostringstream を使用。

2008年4月21日月曜日

svn+sshの注意点

svn+sshでアクセスする場合ユーザー定義のPATHは適用できない。

svn+sshでアクセスする場合はログインシェルすら起動されないため.bash_profile等の設定も有効にならない。

→subversionが指定する独自のPATHに含まれていなければならない。/usr/bin等は無理なので$HOME/binにリンクを貼る。

swap技法

C++ STL vector, stringのswap技法は重要。
Effective STL P.76 「余分な容量を取り除くにはswap技法を使おう」

vector< int>().swap(vec);
string().swap(str);


string()で無名のstringオブジェクトを作成してそれとのswapを行う。
この時のコピーコンストラクタは最小限のメモリしか割り当てないため、余分なcapacityを削減できる。
この最小値は実装による。

2008年4月13日日曜日

boostのunit_testがコンパイルできない。


×g++ -lboost_unit_test_framework -static example.cpp
○g++ example.cpp -lboost_unit_test_framework -static



こんな感じ。(ただし< とboost/test〜の間に空白を入れないこと)

#define BOOST_TEST_MAIN
#include < boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE( test1 )
{

// テスト開始
BOOST_CHECK_EQUAL( 0, 1 );

}

2008年3月10日月曜日

subversion メモ

subversive, subclipse 共にeclipse3.3(jre16), eclipse-fedora3.3(gcc-java)どちらでも落ちまくって使い物にならないので諦めてEclipseのsubversionプラグインは使わないことにする。
→Javaを1.5に落とせば解決した。

1.レポジトリ作成。レポジトリを作成するsubvesionサーバーで実行
svnadmin create レポジトリのトップディレクトリ


2.プロジェクトの(インポートによる)trunkの作成
svn import -m "任意のメッセージ" インポートするソースディレクトリ file:///レポジトリのトップ/プロジェクト名/trunk


3.チェックアウトによるtrunkの作業コピー作成(checkout はcoと略せる。略称は svn helpで見られる)
svn checkout file:///レポジトリトップ/プロジェクト名/trunk 作業コピーディレクトリ名


4.コミットによるレポジトリの更新。作業コピーのコミットする対象ディレクトリで
svn commit -m "任意のメッセージ"


以下3. 4.の繰り返し。

便利なコマンド
svn status ファイル名 :ファイルがcheckoutした時点から変更されているかチェック
svn status --show-updates :ファイルがレポジトリのものから変更されているかチェック
svn diff ファイル名 :現在のcheckoutした時点の作業コピーファイルと現在のファイルとの差分
svn diff -rHEAD ファイル名 :レポジトリのファイルと現在のファイルとの差分
svn log ファイル名 :ファイルの変更履歴
svn update :レポジトリとの同期
svn update ディレクトリ名 :部分的に同期を取る場合
svn info デイレクトリ名 :ディレクトリの情報 。ディレクトリ名を省略するとカレントディレクトリになる。
svn move 元ファイル名 新ファイル名 :ファイル名の変更
svn propedit svn:ignore ディレクトリ名 :svn管理下のファイルに無視属性をつけて同期対象外にする。

2008年2月24日日曜日

テンプレートのイテレータ

vector < T > ::iterator のような表現はTが値か型か確定しないと解釈できないので

typename vector < T > ::iterator

と表記する。

vector < T* > ::iterator でも通る。

2008年2月18日月曜日

TRカード

TRカードについてはとりあえず並行移動だけサポートして回転移動は後に回す。

但し今後の実装を考慮し、4x4アフィン行列にTRカードの内容を読み込んだと仮定して他のルーチンを作成する。


制約:
  • TRカードは並行移動のみサポート

TODO
  • 回転移動の4x4行列への読み込み

boost::xpressive でも警告

boost::ublasと同様にboost::xpressive::sregexもインスタンス化するとその場所で、コピーコンストラクタで初期化していない、という警告が出る。
boost 1.35以降で修正されることを期待して今は放置。当面xpressiveよりregexを使った方が良いのか。

2008年2月17日日曜日

doxygen 雛型(prototype)

doxygenで関数のコメントを付けるときの雛型(prototype)。


/*! \brief 短い説明

関数の詳しい説明

\param[in] 引数名1 引数1の説明
\param[in, out] 引数名2 引数2の説明
\retval 返り値 返り値の説明

\note 注釈
*/

- で箇条書き
-# で番号つき箇条書き

boost::numeric::ublas::matrixを使ってみる。

重要(FAQより)
  • パフォーマンスが必要な場合はコンパイル時に必ずNDEBUGを定義する→expression templateが有効になる。
  • 行列の積の積 prod(A, prod(B, C))がexpression templateにより遅くなる場合
    prod (A,matrix_type (prod (B, C)))
    prod (A, prod < matrix_type > (B, C))
    のようにして明示的に一時行列を導入すれば良い。(メモリ使用量は増える)
  • 要素への配列風アクセスも定義されているが一時オブジェクトが必要になるので(メモリ量的に)高くつく場合がある。(ublas overviewのcompatibilityより)

生成
  • 引数なしコンストラクタで0,0要素行列の生成 → resize(n,m)でn行m列に変形
  • コンストラクタ(n,m)でn行m列 行列を生成させる。
のどちらか。これら以外のコンストラクタはコピーコンストラクタだけ。


メンバ関数にあるもの
  • insert, resize, clear 等コンテナに共通する操作
  • イテレータ関連

演算子オーバーロードされているもの
  • スカラーと行列の四則演算
  • 行列同士の代入、加減
  • ストリームへの &lt&lt 等はboost/numeric/ublas/io.hppで定義

boost::numeric::ublas 以下にはmatrixに限らない、基本的な演算のための非メンバの関数が置かれている
  • prod ベクトル/行列とベクトル/行列の乗算
  • trans 転置

2008年2月15日金曜日

boost::ublas のコンテナでコンパイル時警告

boost::numeric::ublas::matrix を宣言・代入し、returnすると

base class ‘class boost::numeric::ublas::storage_array (略)’ should be explicitly initialized in the copy constructor

という警告が出る。インターネットで調べると
boost::numeric::ublas::vectorでの同様の警告に関する話題あり。

matrix なりvectorなりのコピーコンストラクタが基底クラス storage_array の初期化に失敗している様子。というか初期化していない。(エラーメッセージそのままだけど)

vectorの場合 boost/numeric/ublas/storage.hppの92行目と93行目の間に
storage_array < self_type,ALLOC > (),

と挿入すれば警告は消える。無視して次のリリースでの修正を待っても問題なさそう。
と書いてある。

しかし実際変更するとのtemplate引数は1つだというエラーが出るので
storage_array < self_type > (),

が正解と思われる。 boost 1.34 + g++4.1.2

2008年2月14日木曜日

現時点でのMCNPの拡張点

とりあえず入力ファイル読み取りの時点で考慮した、MCNPからの拡張を挙げる
  • READ カード:READ FILE=ファイル名 によるインクルードを採用(MCNPXでは既採用)
  • 多段インクルード:READ FILEで取り込んだファイル内でのREADカードを受け付ける
  • 前置継続指示(行頭空白5文字)と後置継続指示(&文字)が重複してもOK
  • m表現での浮動小数点形式を受け付ける:例、 1.5e2m は150mに解釈される。
処理過程上で不自然に拡張してしまったもの
  • 入力ファイルは小文字大文字は区別されるが、カード名では区別が無い。sDeFみたいな入力がOK.

2008年2月4日月曜日

boost::regex

smatch.position() はパターン該当部分の最初の位置を示す。


string str=" I want something to drink.";
regex pattern("something");
smatch m;
regex_search( str, m );

str.substr( 0, m.position() );


で文字列中のパターン該当部(パターン含む)以降を削除できる。

2008年2月3日日曜日

boost::lexical_cast

lexical_cast("6.02E23") 等浮動小数点数のキャストもOK
ただし、文字列前後に空白を含んでいるとキャスト失敗で、 bad_lexical_cast が投げられる。(boost 1.33。後のバージョンでは空白は適当に解釈されるというwebページを見た気がする。要確認)

定倍の1.5m 等の表記をlexical_castで変換すれば1.5e2mのような表記もアリ。

とりあえずテスト

bloggerでページを作ってみる。テスト。

WYSIWYGで
  • 箇条書き1
  1. 番号つき箇条書き


引用(blockquote)
等できるのが便利。
preタグは自分で書く必要がある。