207kis00022yav 1996/04/14 19:44:50 前へ 後へ 上へ

fkiss same cel filenames problem


reiftest.lzhでの謎の首相さんの疑問:
> うーみゅ、kisscl ver.1.42だと全員歩いて下さるんですが、
> wkiss(0.65e,f)だとお一人だけしか歩いて下さらないんで
> すね(^^;。どっちが正しいんでしょう?

fkissでは,まんなかの一人しか歩きません.
現状では一応これを正解とさせていただきます.

この問題の要点は,
--------
%rei.kcf
#0 rei_01.cel
#1 rei_01.cel 
;@EventHandler
;@initialize() unmap("rei_01.cel")
--------
というcnfの場合,何も表示されないのか?ということです.

fkissでは,オブジェクト1のrei_01.celが表示されます.
kissclではたぶん何も表示されないでしょう.

なぜkissclとfkissでこのように違った動作をするかというと,
同一名のセルが存在する場合のふるまいの違いが原因です.

fkissにおけるセルの指定は,
上から順に検索して最初に合致したものだけが指定されたセルになります.
しかしkissclだと合致するすべてのものが指定されたセルになるのでしょう.

なぜfkissでは最初に合致したセルだけになっているのかというと,
セルの指定においては,あくまで一つのセルが指定されるべきだ
という考えかたをしているからです.

それと,これは内部処理の話になりますが,
fkissではcnfを読み込むときにイベント拡張に関する記述部分は
内部コードにコンパイルされます.
つまり,map("shorts.cel")は
  map動作の内部コード, "shorts.cel"のセル番号
といった数値に変換されて記憶されます.
(これにより,毎回cnfを解析しなくてもよくなるわけです.)
ところがここで複数のセルを指定可能にしてしまうと
この内部コード保存用のバッファが不定長になってしまうので
まともな仮想記憶のメカニズムのないシステムでは
実装がメンドクサイだろうと思ってあえてこのような制約を設けています.

他にも
o イベントの最大個数は64個
o 一つのイベントあたりのアクションの最大個数は64個
o タイマチャンネルの最大個数は64個
等の制約を設けることにより,
内部コード用のバッファはstaticで確保できるようになっています.
(でもwkissとかは,このへんキチンと処理してて,杞憂の感あり)

----------------------------------------------------------------
で,こういった問題に遭遇したときにどういった対処をすればいいのかというと,
fkissのイベント拡張で指定するセルについては同一のファイルネームを使用しない
つまり同じイメージでも別のファイルにする.
というのが,現状で最も可搬性に優れたやりかたです.

最初に例としてあげたcnfの場合,
"rei_01.cel" を "rei_01a.cel" という名前でコピーして,
--------
%rei.kcf
#0 rei_01.cel
#1 rei_01a.cel 
;@EventHandler
;@initialize() unmap("rei_01.cel") unmap("rei_01a.cel")
--------
というcnfにすれば,何も表示されなくなります.

ちなみに,この場合lhaでアーカイブするより
tar+gzipでアーカイブするほうがアーカイブのサイズは小さくなる可能性大です.

可搬性を無視して,インチキ技を使えばこれ以外にも方法はありますが,
これが現状での「たったひとつの冴えないやりかた」です.
参考までに,これ以外の方法も紹介しときますね.

----------------------------------------------------------------
方法その2 ファイルのシンボリックリンクを使う

ハードリンクだとセルをエディットするとリンクが切れてしまう可能性があるので,
% ln -s rei_01.cel rei_01a.cel
のようにシンボリックリンクを張って
セルをエディットする場合は必ず"rei_01.cel"をエディットする.
(xpxはバカなのでどれをエディットしてもいい)

問題点
ファイルのシンボリックリンクがサポートされたOSでないといけない.
配布用のアーカイブにシンボリックリンクを入れないように気を配らないといけない.


----------------------------------------------------------------
方法その3 オブジェクトを指定する (悪)

map/unmapでセルを指定するのではなく,オブジェクトを指定する.
--------
%rei.kcf
#0 rei_01.cel
#1 rei_01.cel 
;@EventHandler
;@initialize() unmap(#0) unmap(#1)
--------
のようにcnfを変更すると,これまた何も表示されなくなります.

問題点
同じオブジェクトに属するセル全てが指定されてしまう.
map/unmapの規格外の使用方法であり,古いfkiss等では動作しない.


----------------------------------------------------------------
方法その4 ファイネームを悪用する (邪悪)

--------
%rei.kcf
#0 rei_01.cel
#1 Rei_01.cel 
;@EventHandler
;@initialize() unmap("rei_01.cel") unmap("Rei_01.cel")
--------
というふうにcnfを変更すると,またまた何も表示されません.
fkissはイベント拡張部分でのセルの指定のとき,その名前の比較を厳密に行います.
ですから,"rei_01.cel" と "Rei_01.cel" は別のセルとして扱われるのです.
"0.cel" のような最悪の場合でも,
"0.cel", "0.ceL", "0.cEl" ... "0.CEL" と最大8個までは区別可能です.

問題点
はっきりいって邪悪以外のなにものでもないですね.
実際,WKISSでは動作しないでしょう.

----------------------------------------------------------------
以上,MLではフォローしときましたが
とてもいい質問だと思いましたので
こっちにも転載しました.

                                        UHD98984@pcvan.or.jp
                                                        yav

前へ 後へ 上へ