1. 程式人生 > >使用C的陣列來擴充lua

使用C的陣列來擴充lua

1.lua程式碼

ss = require "LUA2C1"

a= ss.new(1000)   --陣列大小為1000
print(a) 

print(ss.size(a))  --獲取陣列的大小
for i=1,1000 do
	ss.set(a, i, 1/i)  --設定陣列的值
end 
print(ss.get(a, 10))   --獲取陣列的值


2.C程式碼(省略了標頭檔案)

typedef struct NumArray {
	int size;
	double values[1]; /* variable part */
} NumArray; 

static int newarray (lua_State *L) {
	int n = luaL_checkint(L, 1);    //檢視引數是否為int型別
	size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double);  //計算大小
	NumArray *a = (NumArray *)lua_newuserdata(L, nbytes);  //分配記憶體空間
	a->size = n;   //賦值
	return 1; /* new userdatum is already on the stack *///傳遞給lua
} 

static int setarray (lua_State *L) {
	NumArray *a = (NumArray *)lua_touserdata(L, 1);  //返回1中記憶體塊的地址
	int index = luaL_checkint(L, 2);    //檢查第二個引數是否為int
	double value = luaL_checknumber(L, 3);  //同上
	luaL_argcheck(L, a != NULL, 1, "`array' expected");  //給第1個引數設定防錯資訊
	luaL_argcheck(L, 1 <= index && index <= a->size, 2,  //第二個引數的防錯
		"index out of range");
	a->values[index-1] = value;    //設定陣列中的數值
	return 0;
}

static int getarray (lua_State *L) {   //獲取陣列中的值
	NumArray *a = (NumArray *)lua_touserdata(L, 1);  //從棧中獲取記憶體塊
	int index = luaL_checkint(L, 2);   //檢查第二個引數的值
	luaL_argcheck(L, a != NULL, 1, "'array' expected");
	luaL_argcheck(L, 1 <= index && index <= a->size, 2,
		"index out of range");
	lua_pushnumber(L, a->values[index-1]);   //獲取第二個引數的值
	return 1;
} 

static int getsize (lua_State *L) {    //獲取陣列的大小
	NumArray *a = (NumArray *)lua_touserdata(L, 1);
	luaL_argcheck(L, a != NULL, 1, "`array' expected");
	lua_pushnumber(L, a->size);   //獲取這個值
	return 1;
} 



static struct luaL_Reg func[] =
{
	{"sum", sum},
	{"l_map", l_map},
	{"add", Add},
	{"l_split", l_split},
	{"showstr", showstr},
	{"str_upper", str_upper},
	{"new", newarray},
	{"set", setarray},
	{"get", getarray},
	{"size", getsize}, 
	{NULL, NULL}
};

int luaopen_LUA2C1(lua_State *L)
{
	luaL_register(L, "ss", func);
	return 1;
}


相關推薦

使用C陣列擴充lua

1.lua程式碼 ss = require "LUA2C1" a= ss.new(1000) --陣列大小為1000 print(a) print(ss.size(a)) --獲取陣列的大小 for i=1,1000 do ss.set(a, i, 1/i)

C++ 中使用字元陣列存放未知長度的字串

#include<iostream> #include<string> using namespace std; int main() {    size_t arry_size = 10;    char * p_str = new char[

c語言:用陣列處理求Fibonacci數列問題

用陣列來處理求Fibonacci數列問題。解:程式:#include<stdio.h>int main(){int i, f[20] = { 1,1 };//對最前面兩個元素f[0]和f[1

C: 你做裁判(排序)

!= pos tput amount UC class color sample 相同 Description 眾所周知,現在各大論壇有很多水王,他們的發貼數是如此之多,以至於必須要用高精度數才能保存。 現在ACMForum決定舉行一次水王爭霸賽, 比賽的規則是將

leetcode705+使用陣列模擬hashset

https://leetcode.com/problems/design-hashset/description/ class MyHashSet { public: int Set[1000010] = {0}; /** Initialize your data struc

jsp頁面 用c標籤迴圈遍歷資料庫某表中裡面的資料 但是頁面不顯示資料

 控制檯也不報錯,頁面也不顯示? 遇到這個情況,第一看jsp頁面的c標籤寫的是否符合正規 我的jsp頁面的c標籤程式碼如下:  c標籤迴圈遍歷的規範 1.有匯入c標籤庫 <%@taglib uri="http://java.sun.com/j

C++陣列C++學習筆記 2)

陣列(array) 陣列是相同型別元素的集合。例如,整型陣列,字串陣列等。 陣列是一種順序容器,它包含單一型別的元素。 C++資料型別 c++中資料型別分為兩種:預定義型別和自定義資料型別。 預定義型別:即預先定義的基本內建資料型別。 自定義資料型別:允許使用者進行資料型別的

C++專案中引入Lua(AlphaGo使用的方案)

       最近大火的AlphaGo,其中的deepmind已經開源,可以到github中下載https://github.com/deepmind/lab·,網上還有一個基於Python開源AlphaGo,那個不是google的。通

C 陣列要點

陣列宣告  int ar[5]={11,22,};                                &n

C++陣列簡單排序並返回序號

#include<vector> #include<algorithm> #include<iostream> using namespace std; void main() { double d1[10] = { 11, 2, 8, 4, 15, 25

C/C++陣列本質論

C/C++陣列本質論 理解陣列名 注:為方便講解,本節所說的指標的型別,指的是指標指向的型別。 1.對陣列名的簡單理解 陣列名錶示的是陣列的首地址。比如一維陣列int a[11]的陣列名a就表示陣列的首地址。這裡的首地址讓人產生誤解,認為陣列名錶示的是整個一維陣列的地址,其實陣列名指向的是陣

C#陣列 動態新增元素

string[] a = new string[] { "1", "2", "3" }; 給a追加一個 "4"

C++陣列求和用自帶的庫超級方便

C++陣列求和用自帶的庫超級方便,而且也達到程式碼更加簡潔的目的。 你只需要做2步: 1、匯入庫檔案 2、新增空間名 using namespace std; 然後就可以直接使用 : accumulate(arrayName, arrayName + 陣列長度, 陣列起

如何利用C語言獲取當地時間和UTC時間 (設當地時間是北京時間)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c/c++ 陣列實現迴圈queue

程式碼:  #include <iostream> #define MAX 5 using namespace std; class Queue{ private: int a[MAX]; int Front; int Rear; public:

c/c++ 陣列實現棧

方法一:結構體實現 #include <iostream> using namespace std; typedef struct{ int d[10]; int top; }Stack; /****初始化一個棧*****/ void init(Stack *s

C/C++陣列詳解(一維和二維)

陣列這東西,說說都懂,但是似乎並沒有完全吃透,導致很多地方有疑惑。所以再梳理一遍。   陣列定義 陣列是存放型別相同的物件的容器,這些物件本身沒有名字,需要通過其所在位置訪問。 從定義中可以看出,陣列存放的是物件且型別相同。所以不存在引用的物件(引用不是物件)

c#陣列的操作

陣列是絕大部分變成語言都支援的一種資料型別,無論是C,C++,C#,或是java。陣列是具有相同資料型別的一組資料的集合。例如水果的集合–蘋果,橘子,香蕉等等。在程式設計中將這些集合稱為陣列。陣列中的每一個變數成為陣列的元素,陣列能夠容納元素的數量稱為的陣列的長度。陣列中的每一個元素都有唯一

C++ primer Plus書之---C++陣列

先看下面的程式碼 #include "iostream" using namespace std; int main() { int cards[4] = {1, 2, 3, 4}; int hand[4]; hand[4] = {2, 3, 4, 5}; hand = cards;

C語言根據運動員的描述判斷他們的名次

邏輯推理題的原題描述是這樣的: 5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果         A選手說:B第二,我第三;         B選手說:我第二,E第四;