Lua Academy · पाठ

FFI से C फ़ंक्शन कॉल करना

Lua से libc और कस्टम साझा लाइब्रेरी फ़ंक्शन बिना अतिरिक्त ओवरहेड के चलाएँ।

पाठ 2, कुल 4 में से13 चरण

FFI से C फ़ंक्शन कॉल करना, CoddyKit पर Lua Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Lua Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

C फ़ंक्शन को सीधे कॉल करना

ffi.cdef से घोषित किए जाने के बाद C फ़ंक्शन को लाइब्रेरी ऑब्जेक्ट के माध्यम से ठीक Lua फ़ंक्शन की तरह कॉल किया जाता है। आर्ग्युमेंट और लौटाए गए मान अपने-आप परिवर्तित हो जाते हैं।

local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2))  -- 1.0

प्रकार परिवर्तन

Lua संख्याएँ डिफ़ॉल्ट रूप से C doubles बन जाती हैं। FFI उन्हें घोषित C पैरामीटर प्रकार में अपने-आप बदल देता है। बूलियन 0/1 बन जाते हैं। स्ट्रिंग const char* बन जाती हैं।

printf को कॉल करना

printf एक variadic C फ़ंक्शन है। इसे फ़ॉर्मैट स्ट्रिंग और आर्ग्युमेंट के साथ ffi.C.printf के माध्यम से कॉल करें।

ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)

लौटाए गए मानों को संभालना

C से लौटाए गए मान अपने-आप Lua प्रकारों में बदल जाते हैं। पूर्णांक Lua संख्याएँ बन जाते हैं, जबकि char* lightuserdata बन जाते हैं (बदलने के लिए ffi.string का उपयोग करें)।

ffi.cdef[[ char *getenv(const char *name); ]]
local ptr = ffi.C.getenv("HOME")
if ptr ~= nil then
  print(ffi.string(ptr))
end

ffi.string

ffi.string(ptr, len) किसी char* पॉइंटर को Lua स्ट्रिंग में बदलता है। len न देने पर यह null byte तक पढ़ता है।

त्रुटियों को संभालना

C फ़ंक्शन त्रुटि कोड लौटाते हैं या errno सेट करते हैं। लौटाए गए मानों की स्पष्ट रूप से जाँच करें। ffi.errno() के माध्यम से errno एक्सेस करें।

ffi.cdef[[ int open(const char *path, int flags); ]]
local fd = ffi.C.open("missing.txt", 0)
if fd < 0 then
  print("Error:", ffi.errno())
end

स्ट्रक्चर आर्ग्युमेंट

C स्ट्रक्चर को मान या पॉइंटर के रूप में पास करें। इन्हें ffi.new से बनाएँ।

ffi.cdef[[
  typedef struct { int x, y; } Point;
  void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)

पॉइंटर आर्ग्युमेंट

ऐसे फ़ंक्शन के लिए आउटपुट पॉइंटर पास करें जो पॉइंटर पैरामीटर के माध्यम से कई मान लौटाते हैं।

ffi.cdef[[
  void minmax(double *arr, int n, double *min, double *max);
]]
local arr = ffi.new("double[5]", {5,2,8,1,9})
local mn, mx = ffi.new("double[1]"), ffi.new("double[1]")
lib.minmax(arr, 5, mn, mx)
print(mn[0], mx[0])

FFI कॉल का प्रदर्शन

C फ़ंक्शन को की गई FFI कॉल का अतिरिक्त समय लगभग शून्य होता है—यह पारंपरिक C API के माध्यम से Lua से C कॉल की तुलना में बहुत तेज़ है। JIT अक्सर कॉल को पूरी तरह इनलाइन कर सकता है।

Variadic फ़ंक्शन

Variadic C फ़ंक्शन (...) को सही प्रकारों के साथ कॉल करना आवश्यक है। अस्पष्टता से बचने के लिए, ज़रूरत पड़ने पर स्पष्ट प्रकार cast पास करें।

ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))

सुरक्षा की विधियाँ

पॉइंटर से लौटे मानों को हमेशा NULL के लिए जाँचें। कभी भी मुक्त किए गए या अपने दायरे से बाहर के पॉइंटर को पास न करें। C आवंटनों के साथ फ़ाइनलाइज़र जोड़ने के लिए ffi.gc का उपयोग करें।

FFI कॉल संबंधी प्रश्न

FFI Lua स्ट्रिंग को C const char* में कैसे बदलता है?

पुनरावलोकन: FFI के माध्यम से C को कॉल करना

लाइब्रेरी ऑब्जेक्ट के माध्यम से C फ़ंक्शन को Lua फ़ंक्शन की तरह ही कॉल करें। FFI प्रकार परिवर्तन संभालता है। char* से लौटे मानों के लिए ffi.string, त्रुटियों के लिए ffi.errno() और स्ट्रक्चर/ऐरे आर्ग्युमेंट के लिए ffi.new का उपयोग करें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Lua सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
40
पाठ
159

अक्सर पूछे जाने वाले प्रश्न

क्या “FFI से C फ़ंक्शन कॉल करना” पाठ निःशुल्क है?

हाँ — Lua Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “FFI से C फ़ंक्शन कॉल करना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“FFI से C फ़ंक्शन कॉल करना” में मैं क्या सीखूँगा?

Lua से libc और कस्टम साझा लाइब्रेरी फ़ंक्शन बिना अतिरिक्त ओवरहेड के चलाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Lua Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Lua Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Lua Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“FFI से C फ़ंक्शन कॉल करना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Lua Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Lua Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. FFI की मूल बातें: ffi.cdef और ffi.load
  2. FFI से C फ़ंक्शन कॉल करना
  3. FFI में पॉइंटर, स्ट्रक्चर और ऐरे
  4. कॉलबैक: Lua फ़ंक्शन C को देना
← Lua Academy पर वापस जाएँ