ぎょーむ日誌 2002-04-18
2002 年 04 月 18 日 (木)
- 0730 起床.
昨日 3 週間ぶりに C++ なんぞいじったんで
C++ 呪わればてぎみ.
シャワー.
借用してきた台車に書籍書類のダンボール箱をつみこむ.
合計 80kg ぐらいか?
0810 自宅発.
晴.
過剰積載の荷物が落ちそうになるのをふせぎながら
北大まで台車を押していく.
0830 研究室着.
朝飯.
コーヒー.
- 昨日の
hash_map
まわり関連のぎょーむ日誌書く.
- おっと,
そういえば,
平八郎提督遭難のメイルいただいたんだ.
遭難と言っても海でも山でもなく,
くだんの武蔵-相模国境紛争領域
(そう,
あの生命保険を引き受けてもらえなかったあの危険地帯)
での出来事とのこと.
深夜に自転車で帰宅しようとしたら,
大学構内暴走してる自動車にはねられて
自転車は修復不可能なほど完全破壊,
提督自身は前まわり受身で頭蓋骨粉砕まぬがれて
足指骨折・擦過傷・歩行困難きたす打撲ですんで,
まったく幸運だったというほかない.
救急車に乗るのは二度目なので慣れたものだと
剛毅なのかあるいはやはりアタマ打ちつけられたんではというような
自慢しておられる.
いやはや,
夜の大学は危険だな.
いかに北大には内燃機関車両は少ないとはいえ,
構内ジョギングするなら昼間にしようか.
- その後日談.
その暴走車運転してたまぬけが提督研究室に
見舞いメロンもってきて,
それを賞味した研究室の教授のコメント
「美味しいね.毎月たのむよ」.
平八郎提督としては「毎週」でなくて助かったとのこと.
- 夜までかかって C++ な呪われと取り組んだ.
昨日導入した STL の非標準コンテナー
hash_map
をより便利に使えないだろうか,
という (結果的に無謀な) 試みであったわけだが
……
- SGI の
文書
によると,
このコンテナーのハッシュのキーとして使えるのは
……
The template hash<T> is only defined for template arguments of type char*, const char*, crope, wrope, and the built-in integral types. If you need a Hash Function with a different argument type, you must either provide your own template specialization or else use a different Hash Function.
とゆーことなんで,
自分でハッシュ関数を定義しないといけない.
- 当方としては自作ライブラリの
Grid
と
呼んでる三次元離散座標
(三次元なのに Grid
たぁ
どういうこと? と言われましても ……)
をキーにできれば,
と考えてる.
いままでは,
Grid
を一義的に整数に変換する関数を定義していた.
これはハッシュ関数として定義したのではなく,
もともと使ってた
map
で使うために作った.
で,
hash_map
にもそれをつかっていた
(この整数が STL のハッシュ関数によってハッシュキーに
変換される).
- 整数でなくて文字列にしたほうが便利ではなかろーか.
さらに
hash_map
コンテナーを定義するときに,
その変換関数もいっしょに定義してしまえば
……
などと考えたために
いろいろと苦労することになってしまったんだよねえ.
- 要約すると核心部のコードはこういうものだ.
ただし後述するようにこれではコンパイラー通らない.
class grid_hash_fuction
{
public:
size_t operator()(const Grid& g)
{
static hash<char*> char_hash_function;
static char buffer[32];
sprintf(buffer, format, g.X(), g.Y(), g.Z());
return char_hash_function(buffer);
}
};
int main (void)
{
hash_map<Grid, int, grid_hash_fuction> ghm;
...
}
……
つまり 3 つの整数を文字列に直して,
あとは STL の文字列→ハッシュ値変換関数つかってやろう,
という意図だ.
- で,
これをコンパイラー (
gcc-2.95.2 + libstdc++2_10
)
に通そうとすると,
このように STL まわりに特徴的な解読困難な警告文を吐き出す
(Netscape 4.7 系で見てるヒトにはさらにヒサンな表示になってるだろう).
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_hashtable.h: In method `size_t hashtable&<pair&<const Grid,int&>,Grid,grid_hash_fuction,_Select1st&<pair&<const Grid,int&> &>,equal_to&<Grid&>,allocator&<int&> &>::_M_bkt_num_key(const Grid &, unsigned int) const':
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_hashtable.h:521: instantiated from `hashtable&<pair&<const Grid,int&>,Grid,grid_hash_fuction,_Select1st&<pair&<const Grid,int&> &>,equal_to&<Grid&>,allocator&<int&> &>::_M_bkt_num_key(const Grid &) const'
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_hashtable.h:460: instantiated from `hashtable&<pair&<const Grid,int&>,Grid,grid_hash_fuction,_Select1st&<pair&<const Grid,int&> &>,equal_to&<Grid&>,allocator&<int&> &>::find(const Grid &)'
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_hash_map.h:176: instantiated from `hash_map&<Grid,int,grid_hash_fuction,equal_to&<Grid&>,allocator&<int&> &>::find(const Grid &)'
sample.cc:34: instantiated from here
/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_hashtable.h:531: passing `const grid_hash_fuction' as `this' argument of `size_t grid_hash_fuction::operator ()(const Grid &)' discards qualifiers
いやはや,
しかしこれはまだ STL がらみでコンパイラーが吐き散らす
意味不明な呪言のなかでは,
まだしも読みやすいほうなのである.
言ってることは,
うえのコードは文法的には間違いではないけど,
STL hash_map
のハッシュ関数として使うには
形式を満たしていない,
といった内容である.
- あとは
/usr/include/g++_3/
以下にあるヘッダーファイル群を熟読して,
この自作 grid_hash_fuction
の形式的マズさを発見しなければならない.
このヘッダーファイルたちとゆーのがまた実に暗号的に書かれていて
……
- このへんは一字一句をゆるがせにすることできなくて
アタマおかしくなりそう
……
結局,
下のように
const
を付け加えることで
(この文脈での意味はつづく {...}
ブロック内で
メンバー変数に変更が加わらないことを保証する宣言
……
ここにはメンバー変数なんてねーよっ!!
という当方の意向は斟酌されない),
STL の悪意に満ち満ちた理不尽は解呪される,
とわかった.
class grid_hash_fuction
{
public:
size_t operator()(const Grid& g) const
...
あまりにもあまりなので,
コンパイル通った瞬間に「わー」とのけぞってしまって
椅子ごと後方にひっくりかえってしまった.
同室で執務中のかとー先生が床に倒れふしている私を眺めて
「なにしてるんですか!?」
といぶかしんでおられる.
- このあとの展開だけど
……
これほど苦労して実現したハッシュ関数は
かえって速度を落すものである,
とわかってしまった.
えーい,
われながらまぬけな
……
- 夜になって,
院生のみなさんがなぜかラーメン食べにいく,
と言っておられるんで私ものそのそとついていく.
外は雨.
北 11 西 4 つまり地環研のすぐ前にある
まるたか
(あ,
Yahoo!
のガイドにものってる).
ここらに書かれてるとーりのような.
- そもそもラーメンあまり食ってないんで,
他とくらべてどうこうというような論評できない.
しかし札幌ラーメンに共通する欠点,
というものを思い出させてくれた
……
どんなものであれラーメン一杯に 630 円もとってしまうのは間違ってる,
と一杯 400 円ぐらいが相場だった九大周辺ラーメン屋を思い出しつつ
私は確信しているのである.
- 自作ハッシュ関数
grid_hash_fuction
.
あきらめきれずにあれこれいじった末に,
やはり使いモノにならんと廃棄.
やれやれ,
なんたる一日.
- 2420 研究室発.
まだちょっと雨ふり.
2430 帰宅.
- 今日の食卓
- 朝 (0840):
米 0.6 合.
昨晩の豆腐炒めもの残り.
- 昼 (1250):
米 0.8 合.
朝の残り.
- 晩 (1930):
北 11 西 4 の
まるたか
の塩ラーメン.
630 円.