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

FreeBASIC Cptr

目次→言語リファレンス→変数とデータ型→データ型を変換CPTR←オリジナル・サイト

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

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

ポインタ表現を、指定されたデータ型ポインタに変換します。

構文:
Cptr( PointerDataType, expression )

記述:
expression(表現)を、PointerDataType に変換します。

PointerDataType は、Pointer 型(DataType PtrAny Ptr など)、または、それへの Type (Alias) でなければなりません。
expression (表現)は、異なったポインター型を持っているか、または、Integer です。


例:
Dim intval As Integer
Dim intptr As Integer Ptr
intval = &h0080
intptr = @intval
'' -128 と 128 が表示されます。最初の表現は、符号付きのバイトとして "seen" 「見られ」ます。
Print *CPtr( Byte Ptr, intptr ), *intptr
Sleep



'Passing string parameters to subroutine
'https://www.freebasic.net/forum/viewtopic.php?t=32316
'by fxm ≫ Jul 19, 2023 5:22
'
'In FreeBASIC, a var-len string 's' has a descriptor under the hood ('@s' = address of its descriptor) that contains 3 data:
'FreeBASIC では、var-len 文字列 's' の内部には 3 つのデータを含む記述子 ('@s' = その記述子のアドレス) があります:
'- address of the string character data,
'文字列文字データのアドレス
'- number of used character,
'使用文字数
'- number of usable characters.
'使用可能な文字数

Type descriptor
    Dim As ZString Ptr address
    Dim As Integer used
    Dim As Integer usable
End Type

Dim As String s = "FreeBASIC"
Dim As descriptor Ptr ps = CPtr(Any Ptr, @s)

Print ps->address
Print ps->used
Print ps->usable
Print
Print *ps->address

Sleep

by fxm ≫ Nov 03, 2023 14:26
https://www.freebasic.net/forum/viewtopic.php?p=301040#p301040

1) 文字列記述子へのポインタから文字列の文字データを取得するには、適切な型付きポインタを使う必要があります( 'Any Ptr'ではありません)。
Dim toStrDes As String Ptr
.....
? "*toStrDes:";*toStrDes

2) 可変長文字列が変更された場合、そのディスクリプタのアドレスは同じままですが、文字列の文字データアドレス (演算子 'Strptr' によって返される)は変更される可能性があります (再割り当てが必要な割り当て済みメモリと同様)。
したがって、'myStr' の長さを変更するたびに、使用する前に 'toStr' ポインタ値を更新する必要があります:
toStr=StrPtr(myStr)
Print "*toStr:";*toStr

'About pointer related
'by fxm ≫ Nov 04, 2023 9:11
'https://www.freebasic.net/forum/viewtopic.php?p=301048#p301048

'文字列文字データへの一種のポインタを絶対に使用したい場合は、
'文字列文字データへの記述子内のポインタへのポインタを使用します。

Dim As String myStr = "This is a string"
Dim toToStr As ZString Ptr Ptr  'ポインタへのポインタ(マルチレベル間接指定)

toToStr = CPtr(Any Ptr, @myStr)
? "toToStr  : "; toToStr
? "*toToStr : "; *toToStr
? "**toToStr: "; **toToStr
?
myStr = "The string is changed to very very ---------------------------------------------------------------long."
? "toToStr  : "; toToStr
? "*toToStr : "; *toToStr
? "**toToStr: "; **toToStr
Sleep

'About pointer related
'by fxm ≫ Nov 04, 2023 9:11
'https://www.freebasic.net/forum/viewtopic.php?p=301048#p301048

'代わりに、文字列文字データへの記述子内のポインターへの参照を使うと、
'明示的な二重逆参照を回避できます (最初の逆参照は暗黙的になります)。

Dim As String myStr = "This is a string"
Dim ByRef As ZString Ptr toStr = *CPtr(ZString Ptr Ptr, 0)  'ポインタへのポインタ(マルチレベル間接指定)

@toStr = CPtr(ZString Ptr Ptr, @myStr)
? "toStr : "; toStr
? "*toStr: "; *toStr
?
myStr = "The string is changed to very very ---------------------------------------------------------------long."
? "toStr : "; toStr
? "*toStr: "; *toStr
Sleep


方言差:

QBからの違い:

参照:
データ型を変換 に戻る

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

ページ歴史:2019-07-04 00:13:13
日本語翻訳:WATANABE Makoto、原文著作者:AntoniGual

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

表示-非営利-継承