FFIにおけるポインター、構造体、配列
FFIでCのポインター、構造体型、配列のアロケーションを扱います。
「FFIにおけるポインター、構造体、配列」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
FFIで扱うCの型
FFIは、int、float、double、char、ポインター、配列、構造体など、標準的なCの型をすべてサポートします。ffi.cdefで宣言してください。
C配列を作成する
ffi.new("type[N]")でC配列を割り当てます。要素には0始まりのインデックス(Cの規則)でアクセスします。
local ffi = require("ffi")
local arr = ffi.new("int[5]", {10, 20, 30, 40, 50})
print(arr[0], arr[1], arr[4]) -- 10 20 50ポインター
値へのポインターを作成するか、ポインター型を割り当てます。参照先の値を取得するにはptr[0]を使用します。
local ffi = require("ffi")
local p = ffi.new("int[1]", 42) -- int* pointing to 42
print(p[0]) -- 42
p[0] = 99
print(p[0]) -- 99構造体の定義とアクセス
cdefで構造体を宣言し、ffi.newでインスタンスを作成して、ドット記法でフィールドにアクセスします。
ffi.cdef[[
typedef struct {
float x, y, z;
} Vec3;
]]
local v = ffi.new("Vec3", 1.0, 2.0, 3.0)
print(v.x, v.y, v.z)構造体の配列
大量のデータ処理には構造体の配列を作成します。これはゲームエンジンや数値計算でよく使われます。
local particles = ffi.new("Vec3[1000]")
for i = 0, 999 do
particles[i].x = i * 0.1
particles[i].y = 0
particles[i].z = 0
endポインター演算
ptr + nでポインターを進めます。これはバイト数ではなく、n個の要素分だけオフセットした新しいポインターを返します。
local arr = ffi.new("int[5]", {1,2,3,4,5})
local p = arr + 2 -- pointer to arr[2]
print(p[0]) -- 3ffi.cast:型キャスト
ffi.cast(ctype, val)は、値を別のC型として再解釈します。誤ったキャストは未定義動作の原因になるため、慎重に使用してください。
local ffi = require("ffi")
local i = ffi.cast("int32_t", -1)
print(i) -- -1
local u = ffi.cast("uint32_t", i)
print(u) -- 4294967295ffi.sizeofとffi.alignof
ffi.sizeof("Vec3")はCの型のバイトサイズを返します。ffi.alignofは、そのアライメント要件を返します。
ffi.gc:ファイナライザーを関連付ける
ffi.gc(ptr, cleanup)は、CポインターにLua関数を関連付けます。ポインターがGCの対象になったときにその関数が呼び出され、CメモリでRAIIを実現できます。
local p = ffi.gc(ffi.C.malloc(1024), ffi.C.free)
-- p is automatically freed when GC collects itヌルポインターを確認する
ポインターをnilと比較します(FFIで比較すると、nilはCのNULLポインターと等しくなります)。
local ptr = lib.allocate()
if ptr == nil then error("allocation failed") endC配列の性能
FFI経由でアクセスするC配列は、数値データについてLuaテーブルより大幅に高速です。ボックス化、ハッシュ検索、型チェックがないためです。
FFI配列に関する質問
FFIではC配列にどのインデックスを使用しますか?
まとめ:FFIのポインター、構造体、配列
ffi.new("type[N]")でC配列を作成し(0始まり)、ドット記法で構造体のフィールドにアクセスします。型の再解釈にはffi.cast、Cメモリの自動解放にはffi.gcを使用します。
よくある質問
「FFIにおけるポインター、構造体、配列」レッスンは無料ですか?
はい。「FFIにおけるポインター、構造体、配列」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「FFIにおけるポインター、構造体、配列」で何を学びますか?
FFIでCのポインター、構造体型、配列のアロケーションを扱います。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「FFIにおけるポインター、構造体、配列」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- FFIの基礎:ffi.cdefとffi.load
- FFIによるC関数の呼び出し
- FFIにおけるポインター、構造体、配列
- コールバック:Lua関数をCに渡す