"RawPointer" (コンパイルタイプ)
"RawPointer" (コンパイルタイプ)
"RawPointer"::[t]
型 t のオブジェクトのポインタを表す.外部ライブラリでの使用に適している.
コンストラクタ
- ToRawPointerを使うと,スタックに割り当てられたメモリを使って,包囲する関数が戻るまで有効なポインタオブジェクトを作成することができる.
- "Managed"でラップされていない限り,CreateTypeInstanceで構築されたポインタオブジェクトは自動的にメモリ管理されないので,DeleteObjectを使って手動で解放しなければならない.
- CreateTypeInstance["RawPointer"::[type]]は生のポインタを構築する.
- CreateTypeInstance["Managed"::["RawPointer"::[type]]]はメモリ管理されたCの生のポインタを構築する.
特性
- 型"RawPointer"::[t]の ptr のInformation[ptr,"BaseType"]は"TypeSpecifier"::[t]を与える.
- FromRawPointer[ptr]は ptr が指す値を返す.
変換
- RawPointer式は.コンパイルされたコードの生のポインタ型に変換することができる.
- "RawPointer"コンパイル要素は,RawPointer式に変換することができる.コンパイルされたコードの生のポインタはCreateTypeInstanceで動的に割り当てなければならない.
- Castを使うとビット表現を変えずにポインタをC配列に変換することも,C配列からポインタに変換することもできる.
- Castを使うと,ビット表現を変えずにポインタを不透明なポインタに変換することも,不透明なポインタからポインタに変換することもできる.
式から
式へ
"CArray"
"OpaqueRawPointer"
Run-Time Errors
- FromRawPointerを使ってポインタを逆参照することは安全な操作ではない.
例題
例 (4)
"RawPointer"::["MachineInteger"]を作成し,それを逆参照する:
cf = FunctionCompile[Function[Typed[arg, "Integer64"],
With[{p = ToRawPointer[arg]}, FromRawPointer[p]]
]]cf[4]ポインタを編集することによってその結果を返すライブラリ関数を表す:
funcDec = LibraryFunctionDeclaration["addonePointer", "compilerDemoBase", {"CInt", "RawPointer"::["CInt"]} -> "CInt"];cf = FunctionCompile[funcDec,
Function[Typed[n, "CInt"], Module[{ptr},
ptr = Typed[ToRawPointer[], "RawPointer"::["CInt"]];
LibraryFunction["addonePointer"][n, ptr];
FromRawPointer[ptr]
]]]cf[12]cf = FunctionCompile[
Function[Typed[n, "Integer64"], Module[{ptr},
ptr = CreateTypeInstance["RawPointer"];
ToRawPointer[ptr, n];
ptr
]]]rp = cf[12]生のポインタを取り,値を抽出してポインタを削除する,コンパイルされた関数:
cf1 = FunctionCompile[
Function[Typed[rp, "RawPointer"::["Integer64"]], Module[{val}, val = FromRawPointer[rp];DeleteObject[rp];val]
]]cf1[rp]値を含む,管理された生のポインタを返すプログラムをコンパイルする:
cf = FunctionCompile[
Function[Typed[n, "Integer64"], Module[{ptr},
ptr = CreateTypeInstance["Managed"::["RawPointer"::["Integer64"]]];
ToRawPointer[ptr, n];
ptr
]]]rp = cf[12]管理された生のポインタを取り値を抽出する,コンパイルされた関数:
cf1 = FunctionCompile[
Function[Typed[rp, "Managed"::["RawPointer"::["Integer64"]]], FromRawPointer[rp]
]]ポインタは"Managed"によって自動的に解放されるので,手動で行う必要はない:
cf1[rp]テクニカルノート
履歴
2022 で導入 (13.1)