一括表示

− 野ざらし言 −

[4259] バッファ確保の記述方法の””について

masa 2012/12/16(Sun) 20:33
この件もオフ会で残ってしまった(質問出来なかった)件です。ここで質問させて下さい。
バッファの確保の記述は、通常下記(1)のように説明されています。

(1)(3+$)."$[8]"

しかし、私のような初心者から見ると、下記(2)のような書き方も考えてしまいます。

(2)(2+$).[8]

で試してみると(2)でも動くようです。ですが、(1)のようにダブルクオートで囲まないと、何か弊害がありますか。

[4260] Re: バッファ確保の記述方法の””について

めざら 2012/12/16(Sun) 23:36
[4259]へのコメント http://homepage3.nifty.com/mezala/
> (1)(3+$)."$[8]"

こちらの記述の場合のバッファのイメージは次のようになります。
(「@」はヌルです。文字列の最後の「"」はヌルに置き換えられます。)
(3+$)."@@@@@@@@@@
      "12345678"+区切りのヌル1個

文字列は必ずダブルクォートで囲む必要があります。
それにより文字列の末尾がヌルとなって「文字列」として扱われます。

一方(2)(2+$).[8] の方のバッファのイメージは次のようになります。

(2+$).[8]@
      123+区切りのヌル1個

つまり見かけ上の文字数しかバッファが確保されていません。

このように3バイトしか確保していなくても,実際に3バイトしか使わないので
あれば不具合は発生しません。しかし,8バイト確保したものと思い込んで
r..3のように7バイト目から2バイトの領域を指定して値の書き込みをすれば,
次の位置にあるマクロを壊してゆきます。致命的な不具合の発生する可能性が
非常に高くなります。暴走するかもしれません。

文字列として $[n] のように記述すると,nバイトのバッファが確保される
というのは記述上の約束です。書式に反した記述をすれば文法違反です。
"$[8]"は"12345678"のような文字列を簡潔に書けるというだけなのです。
文字を何も設定しなければ指定した数のヌルで埋めますが,設定もできます。
"$[8,'*']"のように設定すると,8個の「*」で埋めます。

また,この指定はバッファだけでなく,通常の文字列中にも埋められます。
例: &?("罫線$[20,'-']を引きます")

[4262] Re^2: バッファ確保の記述方法の””について

masa 2012/12/17(Mon) 09:31
[4260]へのコメント

詳細な説明ありがとうございます。文法仕様まで分かって、すっきりしました。
テスト結果の色々なケースも、これで全て説明がつきました。

本を読んでも、そういう目で見ていないせいか、なかなか、ここまでの記述に行き当たらず悩んでいましたが、分かってほっとしました。
最後の最後に質問できる方がいるのは心強いです。

また、よろしくお願いします。

↑ このページの先頭