0Pricing
Lua Academy · บทเรียน

พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI

ทำงานกับพอยน์เตอร์ C ชนิดโครงสร้าง และการจองอาร์เรย์ใน FFI

พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

ชนิดข้อมูล C ใน FFI

FFI รองรับชนิดข้อมูล C มาตรฐานทั้งหมด ได้แก่ int, float, double, char, พอยน์เตอร์ อาร์เรย์ และโครงสร้าง ประกาศชนิดข้อมูลเหล่านี้ใน ffi.cdef

การสร้างอาร์เรย์ C

จัดสรรอาร์เรย์ C ด้วย ffi.new("type[N]") เข้าถึงสมาชิกด้วยดัชนีที่เริ่มจาก 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 สมาชิก ไม่ใช่ 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) ผูกฟังก์ชัน Lua เข้ากับพอยน์เตอร์ C เพื่อให้ฟังก์ชันนั้นถูกเรียกเมื่อพอยน์เตอร์ถูก GC ทำให้ใช้ RAII กับหน่วยความจำ C ได้

local p = ffi.gc(ffi.C.malloc(1024), ffi.C.free)
-- p is automatically freed when GC collects it

การตรวจสอบพอยน์เตอร์ว่าง

เปรียบเทียบพอยน์เตอร์กับ nil ซึ่งเท่ากับพอยน์เตอร์ NULL ของ C ในการเปรียบเทียบของ FFI

local ptr = lib.allocate()
if ptr == nil then error("allocation failed") end

ประสิทธิภาพของอาร์เรย์ C

อาร์เรย์ C ที่เข้าถึงผ่าน FFI เร็วกว่าตาราง Lua อย่างมีนัยสำคัญสำหรับข้อมูลตัวเลข เพราะไม่ต้องบรรจุค่า ไม่ต้องค้นหาแฮช และไม่ต้องตรวจสอบชนิดข้อมูล

คำถามเกี่ยวกับอาร์เรย์ FFI

FFI ใช้ดัชนีใดสำหรับอาร์เรย์ C

สรุป: พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI

สร้างอาร์เรย์ C ด้วย ffi.new("type[N]") ซึ่งเริ่มดัชนีที่ 0 เข้าถึงฟิลด์ของโครงสร้างด้วยสัญลักษณ์จุด ใช้ ffi.cast เพื่อตีความชนิดข้อมูลใหม่ และใช้ ffi.gc เพื่อเก็บกวาดหน่วยความจำ C โดยอัตโนมัติ

คำถามที่พบบ่อย

บทเรียน “พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI”

ทำงานกับพอยน์เตอร์ C ชนิดโครงสร้าง และการจองอาร์เรย์ใน FFI คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน FFI: ffi.cdef และ ffi.load
  2. การเรียกฟังก์ชัน C ผ่าน FFI
  3. พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI
  4. ฟังก์ชันเรียกกลับ: การส่งฟังก์ชัน Lua ให้ C
← กลับไปที่ Lua Academy