True Recordのアドレッシング問題

 

FB^3で登場したTrue Recordにはアドレッシングに問題があります。

 

例を用いて示します。

下記は”vers”リソースを読むために、リソースのデータ構造をレコードで記述し、リソースのデータを読もうとしています。

 

Sample 1  うまくいかない例

 

 Sample 1FN GetCopyRight$の返り値は、残念ながら正しくありません。

関数中にPRINT OFFSETOF(versionCopyRight in versionStructure)versionCopyRightのオフセット値を表示させると良く分かります。期待されるオフセット値は11ですが、実際には12が表示されます。原因は上記赤丸で囲った部分DIM 4 versionShortVersion$5バイト確保されるところが、6バイト確保されているためです。BYTE宣言以外は偶数アドレッシング化されるようです。

これがFBのバグなのか、高速化のため意図的にされているのか分かりませんが、注意が必要です。

下記に正しく動く、一例を示します。

 

Sample 2   正しく実行される場合

 

versionShortVersion` 〜 versionShortLL` というようにBYTE宣言で無理矢理BYTE数を合わせます。これでversionCopyRight$が正しく読込む事ができます。なおversionShortVersionで始まる文字列ですが、宣言文ではversionShortVersion`というようにBYTE宣言をしていますが、関数中に示すように
ver$ = verResHndl..versionShortVersion$
として文字変数のように扱う事もできます。この例では便利ですが、ある意味気をつけなければならず、参照変数型(`, %, &, $など)は必ず付け意図したものが得られるようにしなければなりません。