- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 C 中有一个 A* 算法,打算在 Lua 中使用。现在,A* 本身工作正常,但由于某些奇怪的原因,当我从 Lua 调用它时,当任何一个参数函数(邻居)创建表时,会弹出一个奇怪的错误。在 C 中创建表工作正常。该库有 2 个版本——第一个版本在“main”函数中直接从 C 调用脚本,从 Lua 创建表工作顺利。第二个被编译为 dll 并由在制作表格时崩溃的脚本加载。为什么,我不知道。我已经尝试在 C 中分配我所有的内存并传递 lightuserdata 但它没有任何区别。我在同一台机器上编译了其他 .dll,它们不会复制此错误。
C 库
int run(lua_State *L)
/*
1: string from,
2: string to,
3: string[] Neighbours(string of),
4: int Cost(string from, string to, string dest),
5: int Heuristic(string from, string to, string dest)
*/
{
char flag = 0;
HE = HE ? HE : Heap_Alloc(200);
Heap_Clear(HE);
// create the HASHtable
lua_createtable(L,1,300);
// 6 - HASHtable (string -> {int cost,string Self,string parent})
// get Heuristic(0,from,to)
lua_pushvalue(L,5);
lua_pushstring(L,0);
lua_pushvalue(L,1);
lua_pushvalue(L,2);
lua_call(L,3,1);
{
// 7 - Heuristic(0,from,to)
Heap_val_t hp = {lua_tointeger(L,7), lua_tostring(L,1)};
Z q;
// HASH[from] = {cost=Heuristic, self=from, parent=nil}
lua_pushvalue(L,1);
lua_newuserdata(L,sizeof(struct g));
q = lua_touserdata(L,-1);
q->_cost = lua_tointeger(L,7);
q->_self = lua_tostring(L,1);
q->_parent = 0;
lua_rawset(L,6);
// pop Heuristic(0,from,to) (6)
lua_pop(L,1);
Heap_Push_macro(HE, hp);
while (!Heap_Empty(HE))
{
int i=1;
hp = Heap_Top(HE);
Heap_Pop_macro(HE);
// push Neighbours(Self) on the stack
lua_pushvalue(L,3);
lua_pushstring(L,hp._self);
lua_call(L,1,1); // ALLOCATING TABLE INSIDE THIS GENERATES THE ERROR
while(1)
{
// 7 - neighbours table[]
// push neighbours[i]
lua_rawgeti(L,-1,i);
// check if we got to the end of neighbours
if (!lua_isstring(L,-1))
{
lua_pop(L,1);
break;
}
{
// 8 - neighbours[i]
int cost,heur;
// get HASH[hp.self].cost and pop from stack
lua_pushstring(L,hp._self);
lua_rawget(L,6);
q = lua_touserdata(L,-1);
cost = q->_cost;
lua_pop(L,1);
// call Cost(hp.self,*neighbours,to)
lua_pushvalue(L,4);
lua_pushstring(L,hp._self);
lua_pushvalue(L,8);
lua_pushvalue(L,2);
lua_call(L,3,1);
// add it to cost and remove from stack
cost += lua_tointeger(L,-1);
lua_pop(L,1);
// get Heuristic(hp._obj, *neighbours, to) and pop it
lua_pushvalue(L,5);
lua_pushstring(L,hp._self);
lua_pushvalue(L,8);
lua_pushvalue(L,2);
lua_call(L,3,1);
heur = lua_tointeger(L,-1);
lua_pop(L,1);
// get HASH[*neighbours]
lua_pushvalue(L,8);
lua_rawget(L,6);
q = lua_touserdata(L,-1);
if (!q || q->_cost > cost+heur)
{
Heap_val_t y = {cost+heur, lua_tostring(L,8)};
Heap_Push_macro(HE, y);
// HASH[*neighbours] = {cost=cost, self=*neighbours, parent=hp.self}
lua_pushvalue(L,8);
lua_newuserdata(L,sizeof(struct g));
q = lua_touserdata(L,-1);
q->_cost = cost;
q->_self = lua_tostring(L,8);
q->_parent = hp._self;
lua_rawset(L,6);
}
// remove 10
lua_pop(L,1);
// 9
}
// remove neighbours[i]
lua_pop(L,1);
i++;
// 8
}
// remove neighbours[]
lua_pop(L,1);
// 7
lua_pushstring(L,hp._self);
if (lua_equal(L,-1,2))
{
flag = 1;
// pop the string
lua_pop(L,1);
break;
}
lua_pop(L,1);
}
// 7 - return path table
lua_createtable(L,1,1);
if (flag)
{
int i=1,j;
while(1)
{
Z g;
lua_pushvalue(L,2);
lua_rawget(L,6);
g = lua_touserdata(L,-1);
if (!g->_parent)
{
lua_pop(L,1);
break;
}
lua_pushstring(L,g->_parent);
lua_replace(L,2);
lua_pushstring(L,g->_self);
lua_rawseti(L,7,i++);
lua_pop(L,1);
}
// reverse the table
for (j=1, i--; i-j > 0; i--,j++)
{
lua_rawgeti(L,7,j);
lua_rawgeti(L,7,i);
lua_rawseti(L,7,j);
lua_rawseti(L,7,i);
}
}
}
// replace HASH with return table
lua_replace(L,6);
return 1;
}
LUA 脚本
require 'astar'
function X(z)
local a = z:find'[? ]'
return tonumber(z:sub(1,a))
end
function Y(z)
local a = z:find'[? ]'
return tonumber(z:sub(a))
end
m,n = {-1,-1,-1,0,0,1,1,1},{-1,0,1,-1,1,-1,0,1}
function neighbours(of)
print('neighbours',of)
local x,y = X(of),Y(of)
-- local r = {} -- creating a table from inside the C api crashes
local r = 0
for i=1,#m do
local nx,ny = x+m[i],y+n[i]
--table.insert(r,nx..' '..ny)
end
return r
end
function cost(from,to,dest)
return 1
end
function heuristic(from,to,dest)
local x1,y1,x2,y2 = X(to),Y(to),X(dest),Y(dest)
return math.abs(x1-x2)+math.abs(y1-y2)
end
print{} -- making tables before C api call..
r = astar.run('0 0','1 0', neighbours, cost, heuristic)
print{} -- ..or after doesn't crash
print('r',r)
if r then
print(#r)
for i,j in pairs(r) do
print(i,j)
end
end
最佳答案
我终于明白了:Lua 不喜欢 pendrives。当我卸载 vc++ 项目并从我的硬盘构建它时,一切正常。 children ,不要在 pendrive 上构建 Lua 库。
关于c - 从 c api 内部创建 lua 表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25428993/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!