天天看點

c語言中函數調用案例,C語言中調用Lua函數執行個體

記得上學時,國中英文課本中,上網叫做surfing the internet,中文叫網上沖浪。那個時期,人們經常稱網際網路為賽博空間。如今工作了,大量的零碎時間用于上微網誌,知乎,QQ,這些碎片化的閱讀讓人讀起來輕松,也能擷取些粗淺的資訊。然而它們是消耗時間的黑洞,時間就這樣一分一秒地飛逝,年末的時候,知乎會告訴你回答了多少問題,閱讀了相當于一部《紅樓夢》那麼多的文字。隻是當你靜下來一想,這些淺閱讀并沒給你帶來有深度,系統的知識。在你的時間線上,兩條相鄰資訊往往是八竿子也打不着的。而且你還時不時去看看關注者有沒有更新,期待讓你眼前一亮的資訊。結果往往是趁興而去,敗興而回。螢幕上的資訊永無止境地滾動着,是如此的熱鬧,仿佛每個人都在狂歡,而我的内心卻如此的空虛與孤獨。

在lua API中,調用一個函數的步驟很簡單:

1.壓入你要調用的函數,使用lua_getglobal。

2.壓入調用參數。

3.使用lua_pcall

4.從棧中彈出結果。

舉例說明,假設你有這麼一個lua函數:

function f (x, y)

return (x^2 * math.sin(y))/(1 - x)

end

那麼,我們就可以定義個c函數來封裝這個調用:

double f (double x, double y)

{

double z;

lua_getglobal(L, "f");

lua_pushnumber(L, x);

lua_pushnumber(L, y);

if (lua_pcall(L, 2, 1, 0) != 0)

error(L, "error running function 'f': %s",

lua_tostring(L, -1));

if (!lua_isnumber(L, -1))

error(L, "function 'f' must return a number");

z = lua_tonumber(L, -1);

lua_pop(L, 1);

return z;

}

lua_pcall在壓入結果的之前,會将函數,和參數彈出,如果傳回多個結果,第一個最先壓入。如果lua_pcall運作出錯,那麼會傳回個非0值。

(完)