strtok

Cの関数の strtok の実装を見てみたんだけれど、これ考えた人はポインタを理解しているなぁという、かなり面白い実装だった。まあ、逆にこういうプログラムを組まないとCっぽくないんだけれどね。とも言うが。只管、こういうアルゴリズムというか、テクニックというみたいなものにこだわってプログラムを組むのも面白いけれど、やっぱりそれにはCみたいな言語がいいんだよね。
関数型言語のHaskelとかもこういうテクニックを使って組んでいくのだろうか。関数型自体が結構頭を使うらしいので、もしかしたらそうかもしれないな。
strtokの実装は、簡単なもので
char *szAlphabet = “abcde.fghij.klm.n.opqrs.tuop.qrstu.vwxyz”;
という文字列があるときに、 strtok( szAlphabet, “.” );
としたときに、「.」(ドット)で区切ったトークンを一個ずつ返してくるんだけれど、内部的な動きが面白い。Javaとかならメモリをふんだんに使って全部をList型のデータ構造にコピーして返してくるんだろうけれど、こいつの実装は区切り文字列を ‘\0′ に変換してトークンの先頭アドレスを返してくる。後はそれを配列のポインタとして扱えばいいわけだ。
“abcde\0fghij.klm.n.opqrs.tuop.qrstu.vwxyz”
として返してきて、一度目の呼び出しでは ‘a’の部分のアドレスを返す。二度目の呼び出しでは’\0′の次のアドレスを返してくるので、この例でいうと、’f’ のアドレスだ。
“abcde\0fghij\0klm.n.opqrs.tuop.qrstu.vwxyz”
これを続けていくと、自然にトークンに分断されるというわけだ。
まあ・・・このサイトの絵を見た方が分かりやすいや。

http://www9.plala.or.jp/sgwr-t/lib/strtok.html

ポインタを知ってしまうと、こういう時に余りにも面白いソースコードを書けてしまうのでCはやっぱり面白いよなぁ~と思った。
CellのライブラリもこういうのをSIMDとか、PPE、SPE連携を巧く使って書くと面白いんだろうねぇ まあ、標準関数とかはそこまでしなくても組み込みで早いのがあるんだろうけれど、画像処理とかになってくると、こういう頭の柔らかさが要るんだろうね。って思ったり。

Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]

Spam Protection by WP-SpamFree