2006-08-01から1ヶ月間の記事一覧

Cygwin vs Fiber

そもそもCygwinではFiberが動かないようです。 http://www.cygwin.com/ml/cygwin/2004-12/msg00085.html MLの投稿にレスも付いてませんし、このコードは今のバージョンでも動きません。 いろいろ試した結果、ファイバ関数の中でCRT関数を呼ばない限り落ちな…

sjlj-exceptions

意外と簡単に--enable-sjlj-exceptionsなg++でも動くようになりました。 gccのソースを追ったところ、例外ハンドラに関する情報はスレッド固有領域にある、SjLj_Function_Context構造体で管理されていました。 この構造体は、 struct SjLj_Function_Context …

hamigaki::generator

VC++7.1/8.0、Borland5.82、CodeWarrior8.3で動くものができました。 <hamigaki/coroutine/coroutine.hpp> <hamigaki/coroutine/generator.hpp> クラステンプレートgeneratorの性質上、ヘッダファイルをインクルードするだけで使えないといけません。 その一方、Fiberを用いたコルーチンの実装にはどうしてもwindows.h(と、そこか</hamigaki/coroutine/generator.hpp></hamigaki/coroutine/coroutine.hpp>…

続 Fiberを使ってみる

昨日の続きです。 generatorの実装のため、coroutineに戻り値と中断処理を追加しました。 // コルーチン終了/中断時に投げられる class exit_exception : public std::exception {}; namespace coro_detail { enum state { none, // 通常 exiting, // 呼び出…

Fiberを使ってみる

Boost.Coroutineがacceptされるまで待てないので、勉強がてら簡易版の作成を画策中です。 WindowsのFiberも使ったことなかったので、まずはそちらを弄ってみました。

boost::hashとsize_t/long long

昨日の遅すぎた乱数生成を改良して、そこそこのスピードで動くようにしました。 mt19937&uniform_int&variate_generatorを使うと浮動小数点演算になって遅すぎる→rand48で代用 CRC32も重い→boost::hashで代用 なぜかLinuxで時間系の関数が異様に遅い(VMwar…

続 シードなしで乱数が欲しい

乱数の精度がそれほど必要なく、シードをスレッド固有領域(TSS)に置く場合、Windowsならstd::rand()を使うのが簡単です。なぜなら、少なくともVC++/Borland/CodeWarriorではrand()のシードがTSSに置かれるからです。呼び出し元にstd::srand()を呼んでもらう…

シードなしで乱数が欲しい

Hamigakiライブラリでは次の2箇所で乱数を生成しています。 vorbis_encoderのOggシーケンス番号 tmp_fileのファイル名の一部 現時点の実装はかなりいい加減なので、この部分を作り直しています。 Boost.Randomにはたくさんの乱数生成器がありますが、(rando…

続 CRTPと__declspec(dllexport)

iterator_facadeにも同じ問題を見つけたので、iterator_facadeを使った反復子をdllexportしている箇所を調べてみたところ、Boost.Signalsにありました。 #if BOOST_WORKAROUND(_MSC_VER, <= 1400) void decrement(); void advance(difference_type); #endif#…

Boost.Coroutineでスクリプト

yotto-kさんのLuaサンプルをBoost.Coroutineでやってみました。 http://www12.ocn.ne.jp/~dante98/src/non_visual_novel.cpp スクリプト部分はほぼ同じように書けます。 void main() { msg("まってくださいませ。"); int count = 0; while (true) { ++count;…

CRTPと__declspec(dllexport)

久々にHamigakiライブラリをビルド&インストールしようと思ったら、DLLの作成でコンパイルエラーになってしまいました。普段はexampleとtestだけをスタティックリンクでビルドしているので気が付きませんでした。 問題になっているのは、vorbis_encoder.hpp…

Boost.Coroutine

Google Summer Of Code 2006(SoC 2006)のプロジェクトの一つとして、C++でコルーチンを使えるようにするBoost.Coroutineというものがあります。 http://lists.boost.org/Archives/boost/2006/08/109369.php これを使えば、ここやここで議論していた列挙コー…

hamigaki::uuid

実装用クラスを別ファイルに切り出す作業を続行中です。 今日は、GUIDのパースとフォーマットを行うクラスを切り出しました。 http://hamigaki.sourceforge.jp/hamigaki/uuid.hpp GUID(グイード)はMS用語なので、より広い意味でUUIDを名前にしています。 cla…

コンパイル時文字列っぽいもの

C++

Borland C++の__emit__()擬似関数を使えば、コンパイル時にC文字列を生成できそうな気がしてやってみました。 // 文字列の実体たち __declspec(naked) void ct_string0() { __emit__('\0'); } template<char C1> __declspec(naked) void ct_string1() { __emit__(C1);</char>…

min/maxマクロ問題調査

C++

Boost Inspectツールを使うと、Boostのmin/maxガイドラインに違反しているファイルを見つけることができます。(コメント中のmin/maxも引っかかるので注意) これを使って、min/maxマクロの定義を回避するマクロ、NOMINMAXの影響度を調べてみました。 VC8のラ…

変な環境のサポートやめます

結局、 float = IEEE-754 32bit Single Precision double = IEEE-754 64bit Double Precision に決め打ちしてしまいました。 浮動小数点型のエンコード/デコードもなくして、memcpy()で置き換えていきます。 32/64ビット型を使うため、必然的にCHAR_BIT=9な…

numeric_limits::radix

以前作成したfloat_t(boost::int_tのfloat版)ですが、根本的なところに問題がありました。 float_tは浮動小数点型の精度をチェックするのにstd::numeric_limits<T>::digitsを参照しています。 自分はこれをずっとビット数だと勘違いしていました。 実際には、nu</t>…

Borland 5.82で_Imaginaryは使えません

C++

Boostコンパイラステータスのconfig_infoのテスト結果は、知らないプラットフォームのことを知るのに便利で、最近よく参照しています。 各コンパイラのconfig_infoを眺めていたら、Borland5.82でなぜか__STDC_IEC_559_COMPLEX__が1になっていてビックリしま…

sign_bit for PowerPC

C++

PowerPCも試してみました。 SourceForge.jpのコンパイラファームのgcc2.95.2とgcc3.1だと、 sizeof(float) =4 sizeof(double) =8 sizeof(long double) =8 という環境なのですが、Boostのコンパイラステータスでconfig_infoテストの結果を見ると、 sizeof(flo…

続 signbit

とりあえず思いっきり処理系依存な方法で実装しました。 http://hamigaki.sourceforge.jp/hamigaki/math/sign_bit.hpp <math.h>でsignbit()マクロが提供されているか、i386の環境でだけ動作します。 調べた限り、i386環境ではfloat=4バイト、double=4/8バイト、long </math.h>…

signbit

符号の有無を調べるsignbit()もHamigaki.Mathに入れようかと考え中です。 こちらもMLで議論されていました。 http://thread.gmane.org/gmane.comp.lib.boost.devel/146391 なかなかポータブルな実装はできないようなので、signbit()マクロか、_fpclass()関数…

numeric_limits on Borland 5.82

C++

昨日のBorland 5.82でnumeric_limitsがおかしい問題を調査しました。 まず、Dinkumwareのコードが合っているか検証します。 std::numeric_limits<long double>::quiet_NaN()の実体はxlvalues.cの_LNanです。 このファイルを単体でコンパイルすると、_LNanの値は、 7FFFC00</long>…

is_nan

少し前のBoost MLでNaNの判定が話題になっていたので、 http://thread.gmane.org/gmane.comp.lib.boost.devel/146001 これを参考にしつつ、Hamigaki.Audioのdetailにあるis_nanを独立したヘッダに移動してみました。 http://hamigaki.sourceforge.jp/hamigak…

bcc32の64ビット演算

今日もbcc32と格闘していました。 Regression Testで発生していた警告は全て潰しました。 http://hamigaki.sourceforge.jp/status/ 内2つはどうしようもなかったのでコンパイラオプションで消しました。 W8062 #pragma option pushして、ヘッダ内でpopしな…

min/max問題 再び

今日はのんびりと細かい手直しをしていました。 id:y-hamigaki:20060522 と id:y-hamigaki:20060523 辺りの続きです。 ASIOのスタブ関数が増えたので、別ファイルに移動しよう考えました。 スタブ関数の宣言にはASIOのヘッダのインクルードが必要なのですが…

all tests passed!

数日に及ぶ調査と調整の結果、Borland 5.82とCodeWarrior 8.3でもRegression Testをすべてpassしました。 http://hamigaki.sourceforge.jp/status/ なお、Borland 5.82のvorbis_file_testはVC++8.0で作成したDLL(ogg,vorbis)を使用しています。 それにしても…

CodeGuard detects access over run at vorbisenc.c

さて、前のエントリで「(ここは)動きました」と書いたのは、その先にさらなる罠があったからです。 alloca()の問題を解決することで、ようやくエンコードができるようになりました。 自分のテストプログラムでは、サンプリング周波数を11.025kHz→22.05kHz→44…

続 vorbisencとbcc32

どうもalloca()前後のコードがおかしい感じです。 ↓C++BuilderのCPUウィンドウからのコピペです。 mapping0.c.614: sortindex[i]=alloca(sizeof(**sortindex)*n/2); 00430A26 6A00 push $00 00430A28 8B55C8 mov edx,[ebp-$38] 00430A2B C1E202 shl edx,$02 …

vorbisencとalloca()

vorbis_file_testでBorlandとCodeWarriorがアクセス違反になる件を調べています。 デバッガで覗いてみると、libvorbisの内部でヌルポインタにアクセスして落ちています。 ヌルポインタの発生元を辿っていくと、alloca()が0を返していることが分かりました。 …

続 bcc32とmwccもやってみる

なんだかんだ言いつつもここまで動くようになりました。 http://hamigaki.sourceforge.jp/status/ Broken Compilerをサポートすること自体はあまり乗り気ではないのですが、Compiler StatusのFailを潰していくのが面白かったのと、その過程で別のバグが見つ…