我有一个包含4个线程的程序.
在每个线程中,我做一个luaL_newstate();
每个线程只能访问它自己的lua实例.
有什么我需要担心的吗?[即有一些隐藏的状态,所有lua实例在我背后分享?]
谢谢!
所以这里有很多关于什么是教孩子们编程的最佳方法的帖子.我对下一步感兴趣,教孩子们如何调试不能做他们想要的代码,或者并不总是100%的时间工作(我相信这些是单独的问题,但这可能是主观的).
我从一个游戏开发者的角度问我已经有一个工作游戏(ROBLOX),孩子们可以在我们的嵌入式脚本语言中编写大量疯狂的东西,这恰好是Lua.
我们看到的是,随着这些脚本变得越来越复杂,他们遇到了孩子们没有考虑的边缘情况 - 最终限制了他们可以做的范围.部分解决方案是教育,部分解决方案是更好的调试工具.因此,我提出两个问题:
互联网上有哪些高质量,免费提供的信息来源,我们可以向有抱负的脚本开发人员发送信息,期望他们能从中获得有价值的信息?也许没有,我们需要写一些?
您认为哪些调试工具对孩子最有用?我想要获得回报与复杂性的最佳点.
我们这里的目标人群是有动力的孩子,大多是12-15岁.
我最近阅读了Lua共同创作者Luiz H. de Figueredo和Roberto Ierusalimschy的采访,他们在那里讨论了Lua的设计和实现.至少可以说是非常有趣的.然而,讨论的一部分在我的脑海中带来了一些东西.Roberto称Lua是一个" 独立应用程序 "(也就是说,它是纯粹的ANSI C,它不使用操作系统.)他说,Lua的核心是完全可移植的,并且因为它的纯度已经能够移植很多更容易和甚至从未考虑过的平台(例如机器人和嵌入式设备).
现在这让我很奇怪.C一般来说是一种非常便携的语言.那么,C的哪些部分(即标准库中的部分)是最不可移植的?什么是可以预期在大多数平台上工作的?是否应该只使用一组有限的数据类型(例如避免short和可能float)?怎么样FILE和stdio系统?malloc和free?似乎Lua避免了所有这些.这会把事情发挥到极致吗?或者它们是可移植性问题的根源?除此之外,还有什么其他方法可以使代码非常便携?
我问这一切的原因是因为我目前正在用纯C89编写一个应用程序,并且它最好是尽可能便携.我愿意采取一条中间路来实现它(足够便携,但没有那么多,我必须从头开始编写所有内容.)无论如何,我只想看看编写最好的C代码的关键.
最后,所有这些讨论仅与C89有关.
我试图迭代lua表但我不断收到此错误:
invalid key to 'next'
Run Code Online (Sandbox Code Playgroud)
我知道索引从-8开始,我知道那里有一个表,因为它获得了第一个(也是唯一的)值.但是,它会尝试再次循环,即使我知道表中只有一个字符串.
if (lua_istable(L, index))
{
lua_pushnil(L);
// This is needed for it to even get the first value
index--;
while (lua_next(L, index) != 0)
{
const char *item = luaL_checkstring(L, -1);
lua_pop(L, 1);
printf("%s\n", item);
}
}
else
{
luaL_typerror(L, index, "string table");
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
当我使用正索引时(只要我不从中删除1),这工作正常
编辑:我注意到,如果我单独留下项目的值,我就不会收到此错误.只有当我开始读取item的值时才会出现此错误.当我从表中获得值时,我调用另一个Lua函数,这可能会破坏lua_next吗?
这听起来像一个奇怪的问题,所以我将首先解释周围的情况.
基本上,我有一个用Python编写的3D游戏开发工具包,它本身就能很好地工作.但是,我的大多数用户都习惯使用Lua作为脚本语言,因此我开始研究Lua-Python绑定.
我和Stefan Behnel的神奇Lupa图书馆一起定居下来.但是,它基本上要求最终用户知道如何编译应用程序,这对我的GDK来说是不可接受的.此外,我通常只能访问Linux系统,并且由于我的游戏开发工具包在Windows和Mac OSX上运行,因此Windows二进制文件总是落后,我的OSX用户必须自己编译我的GDK.
有谁知道另一种选择?谢谢!
PS:我已经尝试过Lunatic Python,Lux太过时了.
你用吗
require "name"
Run Code Online (Sandbox Code Playgroud)
要么
local name = require "name"
Run Code Online (Sandbox Code Playgroud)
另外,您是否明确将系统模块声明为局部变量?例如
local io = require "io"
Run Code Online (Sandbox Code Playgroud)
请解释你的选择.
Lua 2ed中的编程说"如果她更喜欢使用较短的名称来代替模块,她可以为它设置一个本地名称",而不是local m = require "mod"更快require "mod".如果没有区别,我宁愿使用清洁require "mod"声明,也不会为预加载的系统模块编写声明.
我正在网上寻找一些好的Lua代码'测试人员',在那里我可以粘贴我的代码并运行它以查看代码本身是否正常以及它是否正常运行,如预期的那样.
它可以是在线工具,但我没有说我不接受任何可以完成相同工作的Windows应用程序.
我搜索了很多,但没有找到任何有趣的东西,所以我真的不知道这样的东西是否可用.
在C代码中,我有一个数组和一个从零开始的索引,用于在其中查找,例如:
char * names[] = {"Apple", "Banana", "Carrot"};
char * name = names[index];
Run Code Online (Sandbox Code Playgroud)
从嵌入式Lua脚本,我可以index通过一个getIndex()函数访问,并希望复制数组查找.鉴于Lua的基于单一的阵列,是否有一个同意"最佳"的方法来做到这一点?
例如,我可以使用与我的C数组相同的内容创建一个Lua数组,但这需要在索引时添加1:
names = {"Apple", "Banana", "Carrot"}
name = names[getIndex() + 1]
Run Code Online (Sandbox Code Playgroud)
或者,我可以避免使用更复杂的表添加1,但这会破坏以下内容#names:
names = {[0] = "Apple", "Banana", "Carrot"}
name = names[getIndex()]
Run Code Online (Sandbox Code Playgroud)
建议采用什么方法?
编辑:感谢您的答案到目前为止.不幸的是,在getIndex函数中向索引添加1的解决方案并不总是适用.这是因为在某些情况下索引是"众所周知的" - 也就是说,可以记录索引0表示"Apple"等等.在这种情况下,是否应优先选择上述解决方案中的一种或另一种,还是有更好的替代方案?
编辑2:再次感谢您的回答和评论,他们确实帮助我思考了这个问题.我已经意识到问题可能出现在两种不同的场景中,理想的解决方案可能各有所不同.
在第一种情况下,考虑例如可能随时间不同的阵列和仅与当前阵列相关的索引.指数在代码之外没有任何意义.Doug Currie和RBerteig是完全正确的:数组应该是基于1的,getIndex应该包含一个+1.如上所述,这允许C和Lua两侧的代码是惯用的.
第二种情况涉及具有含义的索引,并且可能是一个总是相同的数组.一个极端的例子就是names包含的地方"Zero", "One", "Two".在这种情况下,每个索引的预期值是众所周知的,我觉得将Lua端的索引设置为一个是不直观的.我认为应该首选其他方法之一.
我试图在Lua中调用一个接受多个'number'参数的函数
function addShape(x1, y1, x2, y2 ... xn, yn)
Run Code Online (Sandbox Code Playgroud)
我有一个值表,我想作为参数传递
values = {1, 1, 2, 2, 3, 3}
Run Code Online (Sandbox Code Playgroud)
是否有可能在函数调用中动态"解包"(我不确定这是否是正确的术语)这些值?就像是..
object:addShape(table.unpack(values))
Run Code Online (Sandbox Code Playgroud)
相当于调用:
object:addShape(1, 1, 2, 2, 3, 3)
Run Code Online (Sandbox Code Playgroud)
抱歉,如果这是一个完全明显的Lua问题,但我不能为我的生活找到关于这个主题的任何内容.
UPDATE
unpack(values)也不起作用(深入研究方法addShape(...)并检查传递的值的类型显示unpack导致单个string.
lua ×10
c ×3
lua-table ×3
c89 ×1
debugging ×1
declaration ×1
embedding ×1
import ×1
luajit ×1
module ×1
portability ×1
python ×1
require ×1
torch ×1
windows-8.1 ×1