ここではAB4.24の文字列に付いての独自研究を紹介します。
あくまでstring.sbpといくつかの実験
プログラムによって調べただけですので、
実際のところは開発者にお聞きください。
文字列型の構造
ABの文字列は次のように成っています。
文字列の大きさ(4バイト) |
文字列データ(*Byte型) |
下のプログは文字列を入力し、その文字列データと長さに分解する例です。
#N88BASIC
[[Dim]] a As String
Dim i As DWord
Dim z[345] As Byte
[[Input]] a
wsprintf(z, "%u", a)
i=[[Val]](z)
[[Print]] [[MakeStr]](i);"の長さ=";[[GetDWord]](i-4)
_SYSTEM_ALLOCATED_STRING_INFO構造体
string.sbpには_SYSTEM_ALLOCATED_STRING_INFO
構造体が定義さています。
すぐ後に_System_AllocatedStringInfoとして宣言されています。
これはすべての文字列を一元管理するものです。
#N88BASIC
Dim a As String
Dim b As String
Dim c As String
a = "1234567890"
b = "qwerty"
c = "1qaz2wsx"
Dim i As DWord
For i=0 To _System_AllocatedStringInfo.num-1
Print Hex$(GetDWord(_System_AllocatedStringInfo.pAddress + i*4)), MakeStr(GetDWord(_System_AllocatedStringInfo.pAddress + i*4))
Next
ZeroString関数
次のプログラムの実行結果はどうなるでしょう。
#N88BASIC
Dim a As String
Dim b As String
a = ZeroString(10)
b = "abc" + a + "xyz"
Print [[Len]](b), b
答えは
16 abc
となります。
これは+演算が文字列の実際の長さを見ていないからです。
_System_StrCalc_Plus関数を見てください。
最終更新:2010年06月01日 14:46