0Pricing
Lua Academy · レッスン

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])         -- 3

ffi.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)  -- 4294967295

ffi.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") end

C配列の性能

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. FFIの基礎:ffi.cdefとffi.load
  2. FFIによるC関数の呼び出し
  3. FFIにおけるポインター、構造体、配列
  4. コールバック:Lua関数をCに渡す
← Lua Academyに戻る