FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgStringsTypes

目次→教本→プログラマーのための案内Strings (string, zstring, and wstring)←オリジナル・サイト

文字列 (string, zstring, wstring) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

すべての組み込みデータ型の中で、文字列 型は、文字列の表現専用です。

FreeBASIC は、さまざまな表現の文字列を処理するための、いくつかの文字列データ型を提供します。
固定長文字列型(string、zstring、wstring)は固定長の文字列を表し、可変長文字列型は可変長の文字列を表します。

固定長文字列
固定長文字列には 3つの型があります:

可変長文字列
可変長文字列の型は 1つだけです:

上記のすべての型の異なる文字列のサイズ(バイト単位):

'  出力結果は fbc version (before/since 1.20.0) で異なります

Dim As String * 20 s20 = "FreeBASIC manual"

Dim As ZString * 20 z20 = "FreeBASIC manual"
Dim As ZString Ptr pz = @"FreeBASIC manual"

Dim As WString * 20 w20 = "FreeBASIC manual"
Dim As WString Ptr pw = @WStr("FreeBASIC manual")

Dim As String s = "FreeBASIC manual"

Print Using "'FIXED-LENGTH STRING * 20': ## bytes in total, ## useful characters available"; SizeOf(s20); Len(s20)
Print Using "    containing ## user characters of # byte(s) each"; IIf(InStr(s20, Chr(0)) > 0, InStr(s20, Chr(0)) - 1, Len(s20)); SizeOf(s20[0])
Print
Print Using "'FIXED-LENGTH ZSTRING * 20': ## bytes in total, ## useful characters available"; SizeOf(z20); SizeOf(z20) \ SizeOf(z20[0]) - 1
Print Using "    containing ## user characters of # byte(s) each"; Len(z20); SizeOf(Z20[0])
Print "'ZSTRING PTR': dereferencing pointer -> "; """" & *pz & """"
Print Using "    containing ## user characters of # byte(s) each"; Len(*pz); SizeOf((*pz)[0])
Print
Print Using "'FIXED-LENGTH WSTRING * 20': ## bytes in total, ## useful characters available"; SizeOf(w20); SizeOf(w20) \ SizeOf(w20[0]) - 1
Print Using "    containing ## user characters of # byte(s) each"; Len(w20); SizeOf(w20[0])
Print "'WSTRING PTR': dereferencing pointer -> "; """" & *pw & """"
Print Using "    containing ## user characters of # byte(s) each"; Len(*pw); SizeOf((*pw)[0])
Print
Type descriptor : Addr As ZString Ptr : UC As UInteger : AC As UInteger : End Type
Print Using "'STRING': ## bytes in descriptor, memory allocated for ## characters right now"; SizeOf(s); Cast(descriptor Ptr, @s)->AC
Print Using "    containing ## user characters of # byte(s) each"; Len(s); SizeOf(s[0])

Sleep

注:固定長文字列型(QBスタイルの固定長文字列)のみの場合、'Len()' キーワードは、ユーザーによって割り当てられた文字数に関係なく、常に宣言された定数の文字数を返します。
(従って、fbcバージョン1.20.0以前の固定長文字列型に対する式のみ: 'user_characters_length = IIf(InStr(s, Chr(0)) > 0, InStr(s, Chr(0)) - 1, Len(s))')

fbc バージョン1.20.0 未満、win64での出力例(wstring文字は2バイトを使う):
'FIXED-LENGTH STRING * 20': 21 bytes in total, 20 useful characters available
	containing 16 user characters of 1 byte(s) each

'FIXED-LENGTH ZSTRING * 20': 20 bytes in total, 19 useful characters available
	containing 16 user characters of 1 byte(s) each
'ZSTRING PTR': dereferencing pointer -> "FreeBASIC manual"
	containing 16 user characters of 1 byte(s) each

'FIXED-LENGTH WSTRING * 20': 40 bytes in total, 19 useful characters available
	containing 16 user characters of 2 byte(s) each
'WSTRING PTR': dereferencing pointer -> "FreeBASIC manual"
	containing 16 user characters of 2 byte(s) each

'STRING': 24 bytes in descriptor, memory allocated for 32 characters right now
	containing 16 user characters of 1 byte(s) each

Zstring から Ubyte への暗黙の変換
二項演算子 (as assignment, equal, +, *, ...) のいずれかの演算対象が 'Zstring Ptr' ポインタ ('pz')を逆参照する場合、他の演算対象に応じて 'Zstring' 文字列または 'Ubyte' 変数が得られます:
- 他の演算対象が数値の場合、逆参照された 'Zstring Ptr' ポインタ ('*pz') は、指定された 1文字への 'Ubyte' 参照として扱われます。
- この場合、 'Zstring' ポインター・インデックスを作成する '[]' 演算子が逆参照構文 ('pz[n]') として使われる場合、 'String' のインデックスを作成する '[]' 演算子 ('(*pz)[n]') の短縮版となります。

'(*pz)[i]' と 'pz[i][k]' は常に数値(それぞれ 'Ubyte')なので、下のような等式が成り立ちます:
pz[i] = (*pz)[i]
(*pz)[i] = pz[i]
そしてこれも:
pz[i+k] = pz[i][k]
pz[i][k] = pz[i+k]

逆参照された 'Zstring Ptr' を 'Ubyte' 参照に変換する簡単なコード例(「代入」演算子と「+」演算子の演算対象として):

Dim As ZString * (14+1) z = "FreeBASIC     "
Dim As ZString Ptr pz = @z

Print z
z[10] = Asc("2")
*(pz + 11) = Asc("0")                '' *(pz + 11) is converted to an Ubyte reference
(*pz)[12] = Asc("1")
pz[13] = Asc("8")                    '' pz[13] is converted to an Ubyte reference
Print z

For I As Integer = 10 To 13
    Print Str(z[I] - Asc("0"));
Next I
Print
For I As Integer = 10 To 13
    Print Str((*pz)[I] - Asc("0"));
Next I
Print
For I As Integer = 10 To 13
    Print Str(pz[I] - Asc("0"));     '' pz[I] is converted to an Ubyte reference
Next I
Print

Sleep


出力:
FreeBASIC
FreeBASIC 2018
2018
2018
2018

参照
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2024-03-07 03:29:37
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承