พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน 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]) -- 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) ผูกฟังก์ชัน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน FFI: ffi.cdef และ ffi.load
- การเรียกฟังก์ชัน C ผ่าน FFI
- พอยน์เตอร์ โครงสร้าง และอาร์เรย์ใน FFI
- ฟังก์ชันเรียกกลับ: การส่งฟังก์ชัน Lua ให้ C