"CString" (コンパイルタイプ)
"CString"
C言語と互換の文字列を表す.
コンストラクタ
- "Managed"でラップされていない限り,CreateTypeInstanceで構築されたC文字列は自動的にメモリ管理されず,DeleteObjectを使って手動で解放されなければならない. »
- CreateTypeInstance["CString",str]は"String" str からC文字列を構築する.
- CreateTypeInstance["CString",len]は長さ len のC文字列を構築する.
- CreateTypeInstance["CString",cstr,len]は長さ len の cstr のコピーを構築する.cstr が len より短いと,クラッシュする可能性がある.
- CreateTypeInstance["CString",cstr]はヌル終端文字列 cstr のコピーを拘置する.cstr がヌル終端文字列でないと,クラッシュする可能性がある.
変換
- 配列型は管理されたC文字列にCastすることができる.サポートされる配列型には"ListVector","NumericArray","PackedArray"がある.
- Castは"String"オブジェクトを管理されたC文字列に変換するために使うことができる.
- CastはC文字列を未加工のポインタにビットキャストしたり未加工のポインタからビットキャストするために使うことができる.
配列
"String"
"RawPointer"および"OpaqueRawPointer"
例題
すべて開く すべて閉じる例 (1)
Scope (2)
C標準のatofライブラリを使ってC文字列を数字にパースする関数をコンパイルする:
cf = FunctionCompile@Function[{},
Module[{cstr},
cstr = TypeHint["3.14", "CString"];
LibraryFunction["atof"][cstr]
]
]Evaluate the compiled function:
cf[]"CInt"を文字列に変換し,それをサイズ512の管理されたC文字列に保存する:
libDecl = LibraryFunctionDeclaration[
"snprintf",
{"CString", "CInt", "CString", "CInt"} -> "Integer32"
];
fun = Function[{Typed[n, "CInt"]},
Module[{size, cstr, fmt, err},
size = TypeHint[512, "CInt"];
cstr = CreateTypeInstance["Managed"::["CString"], size];
fmt = TypeHint["%d", "CString"];
err = LibraryFunction["snprintf"][cstr, size, fmt, n];CreateTypeInstance["String", cstr]
]
];
func = FunctionCompile[libDecl, fun]func[42]//InputFormPossible Issues (1)
"Managed"オブジェクトの外部で生成されたC文字列は自動的にメモリ管理されないので,手動で解放しなければならない.管理されないC文字列を作成する関数をコンパイルする:
cf1 = FunctionCompile[Function[{},
With[{carr = CreateTypeInstance["CString", 100]},
Null
]]]With[{before = MemoryInUse[]}, Do[cf1[], 10];MemoryInUse[] - before]DeleteObjectを使って手動でC文字列を解放する:
cf2 = FunctionCompile[Function[{},
With[{carr = CreateTypeInstance["CString", 100]},
DeleteObject[carr]
]]]With[{before = MemoryInUse[]}, Do[cf2[], 10];MemoryInUse[] - before]関連項目
LibraryFunctionDeclaration DeleteObject
コンパイルタイプ: String CArray CChar RawPointer OpaqueRawPointer
テクニカルノート
履歴
2022 で導入 (13.1)