FreeBASIC STRING
目次→言語リファレンス→変数とデータ型→標準のデータ型→文字型→STRING←オリジナル・サイト
目次→実行時ライブラリー参考→文字列関数→STRING←オリジナル・サイト
標準のデータ型:
8ビットの文字列
構文:
dim variable as String [ * size]
説明:
String は、文字の並びです。
size パラメータなしで宣言された
String は、文字列の長さにより、動的にサイズ変更されます。
長さの範囲は、0 バイトから 2 ギガバイトです。
記述子(descriptor)には、実際の文字列へのポインター、文字列の長さ、およびそれに割り付けられたスペースの量が含まれます。
VarPtr は、記述子へのポインターを返します。一方、
StrPtr は実際の文字列を指します。
String の隠れた記述子のため、
たとえば、メモリ割り当て関数
Callocate を(優先的に)使って、文字列に手動で領域を割り当てることは推奨されません。
ループ内での不必要な割り当てを防ぐなどの目的で、
String に特定の容量を確保する一般的な方法は、
Space か
String 関数を使うことです。
それでも、必要に応じて、メモリ割り当て関数
Allocate,
Callocate,
Reallocate (使用上の注意を参照)と文字列ポインタ(文字列データではなく文字列記述子へのポインタ)を使って、動的割り当てを慎重に行うことができます。
文字列記述子(string descriptor)を保持するためにメモリを割り当てた場合、各文字列記述子の割り当てを解放する前に、常に文字列を破棄(
"" に設定)する必要があります(文字列データが占有していたメモリの割り当てを解放できます)。
そうしないと、後で割り当てを解放できないので、プログラム継続時にメモリリークを引き起こす可能性があります。
より簡単で安全に動的割り当て/割り当て解除を行うには、高度な
New /
Delete キーワード(これ自体が文字列オブジェクトのコンストラクタ/デストラクタも呼び出す)を使うことです。
記述子の使用にもかかわらず、暗黙の
NULL 文字 (
chr(0)) が、文字列の終端に加えられます。遅いコピーを作らずに、文字列を外部ライブラリの関数に渡すことを可能にするためです。
FreeBASIC の内部関数はこの
NULL 文字を無視して、これを文字列の一部として扱いません。
固定サイズで宣言された
String(数値定数、またはコンパイル時に評価可能な式)は、QB スタイルの固定長文字列です。ただし、fbc version 1.20.0 未満では未使用文字は 0 に、fbc version 1.20.0 以降ではスペースに設定されます(どの "-lang" コンパイラオプションが使用されているかにかかわらず)。これはディスクリプタを持たず、内容に合わせてリサイズされません。QB と同様に、データが文字列のサイズを超えた場合、右側が切り捨てられます。
fbc バージョン1.20.0 未満は、固定長文字列も
NULL 文字で終端していたため、
size + 1 バイトの空白を使いました。この
NULL 終端文字は fbc version 1.20.0 以降削除され、冗長な文字がユーザ定義
Type のデータレイアウトを複雑にするのを防いでいます。
注意: fbc バージョン 1.20.0 未満では、固定長の文字列変数を含む文字列式で明示的な
NULL 文字 (
chr(0)) を使うことは推奨されていませんでした。これは、使用状況 (初期化、割り当て、連結、...) に応じて異なる予期しない結果が生じる可能性があるためです。
文字列変数名は、BASIC の他の方言のようなドル記号
$ で終わる必要はありません。
lang fb では、ドル記号を含む変数接尾辞は、禁止されています。
例:
'' 可変長
Dim a As String
a = "Hello"
Print a
a += ", world!"
Print a
Dim As String b = "Welcome to FreeBASIC"
Print b + "! " + a
Sleep
'' QB-like $ suffixes
#lang "qb"
'' DIM based on $ suffix
Dim a$
a$ = "Hello"
'' $ 接尾辞に基づいた暗示宣言
b$ = ", world!"
Print a$ + b$
Sleep
'' バッファとしての可変長文字列
'' 文字列のためにスペースを予約する、
'' 多くの空白文字を生成するために Space() を使う (ASCII 32)
Dim As String mybigstring = Space(1024)
Print "buffer address: &h" & Hex( StrPtr( mybigstring ), 8 ) & ", length: " & Len( mybigstring )
'' 明示的に文字列を破壊する
mybigstring = ""
Print "buffer address: &h" & Hex( StrPtr( mybigstring ), 8 ) & ", length: " & Len( mybigstring )
Sleep
'' Const パラメータとしての可変長文字列
'' Const修飾語は、文字列が修正されるのを防ぎます
Sub silly_print( ByRef printme As Const String )
Print ".o0( " & printme & " )0o."
'次の行は、コメントを外すとエラーを引き起こすでしょう
'printme = "silly printed"
End Sub
Dim As String status = "OK"
silly_print( "Hello FreeBASIC!" )
silly_print( "Status: " + status )
Sleep
バージョン:
- fbc 1.20.0 より前は、固定長文字列は NULL 文字で終端していたため、size + 1 バイトのスペースが使用されていました。
QBからの違い:
- QBでは、文字列は、32,767文字に制限されていました。
- QBでは、固定長文字列の未使用の文字は、32(ASCII の空白、あるいは " ")で初期化されました。
- QBでは、データのバイト数を表わすために、レコード内で静的な文字列や固定サイズの文字列がよく使われていました。例えば、ファイルから読み込んだ UDT 内の1バイトを表わす長さ1の文字列などです。
fbcバージョン 1.20.0 以前の FreeBASIC では、文字列の後に常 に NULL 文字が続くため、これは不可能でした(ファイルから UDT を読み込む fbcバージョン1.20.0以前の QBasic コードを変換する場合、"As String * n" のすべてのインスタンスが "As uByte (0 to n - 1)" に置き換えられていることを確認してください。)
参照:
ページ歴史:2024-03-07 07:07:03
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall