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

FreeBASIC Zstring (文字)

目次→言語リファレンス→変数とデータ型→標準のデータ型→文字型→ZSTRING←オリジナル・サイト

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

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

標準のデータ型: 8ビットの文字列

構文:
dim variable as Zstring * size
dim variable as Zstring ptr

記述:
Zstring は、C-スタイルの、固定長文字列です。
これは記述子(descriptor)を持っていません。したがって、引数として関数に渡すとき、Zstring の長さは、より速く計算されます。
固定 size の変数(数値定数、またはコンパイル時に評価可能な式)の場合、FreeBASIC は、size - 1 の長さに内容を切り詰めることで、代入時に発生するオーバーフローを回避します。

Zstring ptr は、標準の Zstring を指すことができ、「ユーザー管理」Zstring を実装するために使えます。
この場合、Allocate / Reallocate / Deallocate を使って、サイズ、サイズ変更、破棄を行う必要があり、ユーザーがオーバーフローを回避する必要があります。

文字列の終端は、ヌル文字 (0 ASCII) でマークされています。
これは、FreeBASIC 文字列操作関数によって、自動的に追加されます。
文字列が作成される時に、ヌル文字が追加されます。文字列の長さは、文字列の最初のヌル文字を走査することで計算できます。
ヌル文字(例えば Chr(0))を、Zstring のテキストに、含めることはできません。含めると、文字列の残りは切り捨てられます。

Zstring では、Len は、含まれている文字列のサイズを返します。Sizeof は、Zstring に割り当てられたスペースを返します。
Sizeof 機能するのは、サイズがコンパイラに認識されている場合のみです。つまり、固定サイズの Zstring 変数が、直接渡されます。間接参照されたポインターや、Byref 関数の引数としてではありません。

Left のような組み込み文字列関数は、Zstring に使えます。他の文字列演算子も同様に動作します。

この型は、C ライブラリとのインタフェースを簡単にしたり、ポインタで管理できない固定長文字列を置き換えるために提供されています。
Zstring ptr として宣言されたパラメータを参照する手続きには、文字列型の引数を直接渡すことができます。
コンパイラは、文字列型引数と Zstring ptr 型パラメータの間で、自動変換(警告メッセージなしで)します。

Zstring に動的メモリを割り当てる場合、null 文字(Zstring の終端文字)なしで文字列データを作成しないようにするため、最も安全なのは Callocate を使うことです(最悪の場合、 Allocate を使い、2番目の例のように、文字列データを即座に割り当てます)。

注意: 二項演算子(代入、等号、+、*、...)の演算対象が、'Zstring Ptr' ポインタ ('pz') の逆参照に含まれる場合、他の演算対象に応じて、'Zstring' 文字列または 'Ubyte' 変数を与えることができます。
他の演算対象が数値の場合、逆参照された 'Zstring Ptr' ポインタ ('*pz') は、ポイントされた 1文字への 'Ubyte' 参照として扱われます。
'Zstring' ポインター索引 '[]' 演算子が、逆参照構文 ('pz[n]') として使われる場合、これは基本的に'String' 索引 '[]' 演算子('(*pz)[n]') の短縮バージョンです。

例:
Dim As ZString * 13 str1 => "hello, world"
Print str1
Print Len(str1)     '12 と表示されます。文字列に含まれるサイズを返します。
Print SizeOf(str1)  '13 と表示されます。変数のサイズを返します。
Sleep



Dim As ZString Ptr str2
str2 = Allocate( 13 )
*str2 = "hello, world"
Print *str2
Print Len(*str2)     '12 と表示されます。文字列に含まれるサイズを返します。
Sleep



'Address of

'Difference between "Sadd", "StrPtr", "VarPtr", and "Address of"
'https://www.freebasic.net/forum/viewtopic.php?f=2&t=28698&p=274159#p274158
'by dodicat ≫ Jul 14, 2020 20:32
'
'@ is OK for variable length, it is @s[0]
'in fact @s[0] is universal, it works for everything including literals.
'It's a workaround because s[0] is a Ubyte, and @s[0] returns a Ubyte Ptr (not a (Z|W)String Ptr).

 
Dim As String s="abcdefghij"
Print "Dim As String s=""abcdefghij"""
Print "StrPtr(s)= ",StrPtr(s)
Print "@s= ",@s
Print "@s[0]= ",@s[0]
Print

Dim As String * 10 g="abcdefghij"
Print "Dim As String * 10 g=""abcdefghij"""
Print "StrPtr(g)= ",StrPtr(g)
Print "@g= ",@g
Print "@g[0]= ",@g[0]
Print

Dim As ZString * 10 h="abcdefghij"
Print "Dim As ZString * 10 h=""abcdefghij"""
Print "StrPtr(h)= ",StrPtr(h)
Print "@h= ",@h
Print "@h[0]= ",@h[0]
Print

Print "StrPtr(""ghijklmnopqrstuvw"")= ",StrPtr("ghijklmnopqrstuvw")
Print "@""ghijklmnopqrstuvw""= ",@"ghijklmnopqrstuvw"
Print "@(""ghijklmnopqrstuvw"")[0]= ",@("ghijklmnopqrstuvw")[0]
#Print TypeOf("ghijklmnopqrstuvw") 'ZString * 18
Print
Print "OutPut 画面に ZString * 18 と表示されているはず。何かキー入力で終了。"
Sleep


方言差:

QBからの違い:

参照:
標準のデータ型に戻ります。
文字列関数に戻ります。

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

ページ歴史:2021-04-28 23:41:40
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

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

表示-非営利-継承