在PSQL中,有没有一种很好的方法来查找从另一个表继承的所有表?理想情况下,我可以从SQL查询中获取数据,但此时,我对任何可靠的方法都很满意.
我是Bitfighter的首席开发者,我正在使用Lua添加用户脚本机器人.我正在使用Cun和Lua使用Lunar将它们粘合在一起.
我正在尝试做一些我认为应该非常简单的事情:我在Lua中有一个C++对象(下面代码中的bot),我在其上调用了一个方法(findItems),它导致C++搜索周围的区域机器人并返回它找到的对象列表(TestItems和其他未在此处显示).我的问题是如何组装并返回C++中找到的项目列表,然后在Lua中迭代它们?
基本上,我想填写<<<<创建项目列表,将其返回到lua >>>>下面的块,并在Lua代码本身中进行任何更正,包括在下面.
我试图保持代码简单但完整.希望这里没有太多!谢谢!
C++头文件
class TestItem : public LuaObject
{
public:
TestItem(); // C++ constructor
///// Lua Interface
TestItem(lua_State *L) { } ; // Lua constructor
static const char className[];
static Lunar<TestItem>::RegType methods[];
S32 getClassID(lua_State *L) { return returnInt(L, TestItemType); }
};
class LuaRobot : public Robot
{
LuaRobot(); // C++ constructor
///// Lua Interface
LuaRobot(lua_State *L) { } ; // Lua constructor
static const char className[];
static Lunar<LuaRobot>::RegType methods[];
S32 findItems(lua_State …Run Code Online (Sandbox Code Playgroud) 我是Bitfighter的首席开发者,我们正在使用Lua和C++的混合,使用Lunar(Luna的一种变体,可在此处获得)将它们绑定在一起.
我知道这个环境对面向对象和继承没有很好的支持,但是我想找到一些方法来至少部分地解决这些限制.
这就是我所拥有的:
C++类结构
GameItem
|---- Rock
|---- Stone
|---- RockyStone
Robot
机器人实现了一个调用的方法getFiringSolution(GameItem项目),着眼于位置和速度项目,并返回该机器人将需要火打角项目.
-- This is in Lua
angle = robot:getFiringSolution(rock)
if(angle != nil) then
robot:fire(angle)
end
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我想通过岩石,石头,或rockyStones到getFiringSolution方法,我不知道该怎么做.
这仅适用于Rocks:
// C++ code
S32 Robot::getFiringSolution(lua_State *L)
{
Rock *target = Lunar<Rock>::check(L, 1);
return returnFloat(L, getFireAngle(target)); // returnFloat() is my func
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要做的是这样的事情:
// This is C++, doesn't work
S32 Robot::getFiringSolution(lua_State *L)
{
GameItem …Run Code Online (Sandbox Code Playgroud) 我正在为Bitfighter游戏(http://bitfighter.org)记录一个新的和扩展的Lua API.我们的Lua对象模型是C++对象模型的一个子集,我需要记录的暴露给Lua的方法是C++中可用方法的一个子集.我想只记录与Lua相关的项目,而忽略其余的项目.
例如,对象BfObject是所有Lua对象的根,但它本身位于C++对象树的中间.BfObject有大约40种C++方法,其中大约10种与Lua脚本编写者相关.我希望我们的文档将BfObject显示为根对象,并仅显示那10个相关方法.我们还需要以一种使方法的继承清晰的方式显示其子对象.
目前我们可以假设所有代码都是用C++编写的.
一种想法是以某种方式标记我们想要记录的对象,使得诸如doxygen之类的系统知道要查看什么并忽略其余部分.另一种方法是以这样的方式预处理C++代码,即删除所有不相关的位,并记录像doxygen这样的东西.(我实际上使用luadoc这种方法已经相当远了,但找不到让luadoc显示对象层次结构的方法.)
可能有用的一件事是每个Lua对象类都以一致的方式与其父类一起注册.
有越来越多的游戏使用Lua编写脚本,其中许多都有不错的文档.有没有人对如何生产它有一个很好的建议?
PS为了澄清,我很高兴使用任何可以完成这项工作的工具 - doxygen和luadoc只是我熟悉的例子.
我无法在任何地方找到这个看似简单的问题的答案.
以下C++函数是否使用RTTI?它当然不必,但我想知道是否有保证在编译时确定typeid.
template <typename T>
const char *getName()
{
return typeid(T).name(); // Resolved at compile time?
}
Run Code Online (Sandbox Code Playgroud) 我是Bitfighter的首席开发者,我们使用Lua作为脚本语言,允许玩家编写自己的定制机器人船.
在Lua中,除非另有声明,否则不需要声明变量,并且所有变量都默认为全局范围.这导致一些问题.以下面的代码段为例:
loc = bot:getLoc()
items = bot:findItems(ShipType) -- Find a Ship
minDist = 999999
found = false
for indx, item in ipairs(items) do
local d = loc:distSquared(item:getLoc())
if(d < minDist) then
closestItem = item
minDist = d
end
end
if(closestItem != nil) then
firingAngle = getFiringSolution(closestItem)
end
Run Code Online (Sandbox Code Playgroud)
在这个片段中,如果findItems()没有返回候选者,那么nearestItem仍将引用它最后一次发现的任何船只,并且在此期间,该船可能已被杀死.如果船被杀死,它将不再存在,并且getFiringSolution()将失败.
你发现了这个问题吗?好吧,我的用户也不会.它很微妙,但具有戏剧性的效果.
一种解决方案是要求声明所有变量,并且所有变量都要默认为本地范围.虽然这种改变不会使程序员无法引用不再存在的对象,但这会使得在无意中这样做更加困难.
有没有办法告诉Lua默认所有变量到本地范围,和/或要求它们被声明?我知道其他一些语言(例如Perl)有这个选项.
谢谢!
这里有很多好的答案,谢谢!
我决定采用Lua'严格'模块的略微修改版本.这似乎让我想到了我想去的地方,我会稍微改进一下消息,使它们更适合我的特定环境.
我正在使用x-macros来减少重复次数和代码重复,同时为游戏Bitfighter实现Lua接口.以下代码工作正常:
// Fn name Valid param profiles Profile count
# define TELEPORTER_LUA_METHOD_TABLE \
TELEPORTER_LUA_METHOD_ITEM(addDest, ARRAYDEF({{ PT, END }}), 1 ) \
TELEPORTER_LUA_METHOD_ITEM(delDest, ARRAYDEF({{ INT, END }}), 1 ) \
TELEPORTER_LUA_METHOD_ITEM(clearDests, ARRAYDEF({{ END }}), 1 ) \
// BLOCK A Start
const luaL_reg Teleporter::luaMethods[] =
{
# define TELEPORTER_LUA_METHOD_ITEM(name, b, c) { #name, luaW_doMethod<Teleporter, &Teleporter::name > },
TELEPORTER_LUA_METHOD_TABLE
# undef TELEPORTER_LUA_METHOD_ITEM
{ NULL, NULL }
};
// BLOCK A End
/* Generates the following:
const luaL_reg Teleporter::luaMethods[] =
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 numpy 编写一些基本的 Python 代码,作为一个非常致力于严格类型检查概念的人,我发现它有点具有挑战性。
我正在将 VS Code 与 pylance 一起使用,并且我的环境在某种程度上受到版本和库的限制。
一个简单的例子:
flags = chi_squared > .5 # chi_squared is type np.ndarray
indices = chi_squared.argsort()
Run Code Online (Sandbox Code Playgroud)
第一行很好;没有类型警告,所有内容的类型都是已知的(即使标志是“Any”)。然而,第二行给了我一个类型错误,因为“argsort() 的类型部分未知”。
这很奇怪......但是当我追踪 numpy 类型存根时,我发现 argsort 实际上部分未定义:
def argsort(self, axis=..., kind=..., order=...) -> typing.Any:
'a.argsort(axis=-1, kind=None, order=None)\n\n Returns the indices that would sort this array.\n\n Refer to `numpy.argsort` for full documentation.\n\n See Also\n --------\n numpy.argsort : equivalent function'
...
Run Code Online (Sandbox Code Playgroud)
axis、kind、 并且order没有类型(并且返回 Any 也有点蹩脚......这个函数真的可以返回任何类型吗?)
结果,我的代码中大约有一半的行存在这样的级联类型错误,因此我的代码充满了# type: ignore指令。
我知道 Python …
这让我疯了一个多星期.下面是来自游戏Bitfighter中机器人玩家的Lua代码的两个片段(用C++编写,使用LuaWrapper的变体进行绑定).
当我第一次启动Lua脚本时,两者都完全按预期工作.但经过几分钟的强烈对象创建和破坏后,变体2停止工作,并给我以下错误:
robot.lua:253: attempt to call missing or unknown method 'getEnergy' (a nil value)
Run Code Online (Sandbox Code Playgroud)
在我看来,这些功能应该相同.谁可以解释这个区别?
注意:target是表示C++对象的(重)用户数据.getEnergy和getHealth是正确注册的C++函数.我可以轻松地重现这种不同的行为.这是Lua 5.1,使用luavec mod.
变体1 - 始终有效
local mt = getmetatable(target)
local pow = mt.getEnergy(target) + mt.getHealth(target)
Run Code Online (Sandbox Code Playgroud)
变体2 - 在脚本运行任意时间后开始失败
local pow = target:getEnergy() + target:getHealth()
Run Code Online (Sandbox Code Playgroud) 我是Bitfighter的主要开发者,并且在将游戏移植到64位Linux时遇到了问题.这应该是一个相对容易和常见的问题,但它已经困扰了许多人,我找不到有关它的好信息.
[[该代码使用gcc版本4.1.2和其他代码编译为32位,并且因64位Linux的几种变体而失败,但我依赖其他人的报告,并且没有确切的gcc版本失败.但对于一些Linux版本来说,它失败了.我99%肯定这不是编译器版本问题.]]
我有以下内容:
void UserInterface::drawCenteredString(int y, int size, const char *format, ...)
{
va_list args;
va_start(args, format);
char buffer[2048];
dVsprintf(buffer, sizeof(buffer), format, args);
va_end(args);
drawCenteredString2(y, size, buffer);
}
// Elsewhere, in platform.cpp... (this is where the error occurs)
S32 dVsprintf(char *buffer, int bufferSize, const char *format, void *arglist)
{
return vsnprintf(buffer, bufferSize, format, (char *) arglist);
}
Run Code Online (Sandbox Code Playgroud)
这在32位平台上运行良好.但是,当我在64位Linux上编译它时,它失败了:
platform.cpp:457: error: cannot convert 'char*' to '__va_list_tag*' for argument '4' to 'int TNL::vsnprintf(char*, size_t, const char*, __va_list_tag*)'
Run Code Online (Sandbox Code Playgroud)
我尝试了很多变种,包括: …
我是Bitfighter的首席开发者,这是一款主要用C++编写的游戏,但是使用Lua来编写机器人玩家的脚本.我们正在使用Lunar(Luna的一个变种)将这些位粘合在一起.
我现在正在努力解决我们的Lua脚本如何知道他们引用的对象已被C++代码删除.
这是一些示例机器人代码(在Lua中):
if needTarget then -- needTarget => global(?) boolean
ship = findClosest(findItems(ShipType)) -- ship => global lightUserData obj
end
if ship ~= nil then
bot:setAngleToPoint(ship:getLoc())
bot:fire()
end
Run Code Online (Sandbox Code Playgroud)
请注意,仅在needTarget为true时设置ship,否则使用上一次迭代的值.很可能(甚至,如果机器人一直在做它的工作:-),因为变量是最后一次设置,所以该船将被杀死(并且其对象被C++删除).如果是这样,当我们调用ship:getLoc()时,C++会适合,并且通常会崩溃.
所以问题是如果(程序员)犯了错误,如何最优雅地处理这种情况并限制损害.
我有一些想法.首先,我们可以创建某种Lua函数,C++代码可以在船舶或其他项目死亡时调用:
function itemDied(deaditem)
if deaditem == ship then
ship = nil
needTarget = true
end
end
Run Code Online (Sandbox Code Playgroud)
其次,我们可以实现某种引用计数智能指针"神奇地"修复问题.但我不知道从哪里开始.
第三,我们可以使用某种类型的死机检测器(不确定它是如何工作的)机器人可以这样调用:
if !isAlive(ship) then
needTarget = true
ship = nil -- superfluous, but here for clarity in this example
end
if needTarget then -- needTarget => …Run Code Online (Sandbox Code Playgroud) 我正在使用Postgres数据库设计一个具有相当复杂的桌面设计的应用程序,并且我坚持一点,我希望有人可以提供建议.
我有几个表,每个表都有一个功能ID(或fid).不同类型的实体具有不同的属性模式,因此我必须为每种类型创建不同的表.但是,我想确保fids在所有实体类型中都是唯一的.
如果我有三个实体类型,Entity1/2/3,由以下3个表表示:
Entity1 Entity2 Entity3
fid fid fid
attribute1 attribute2 attribute3
Run Code Online (Sandbox Code Playgroud)
如何确保系统中的任何位置都没有重复的fid?
谢谢!
TextItem是.的子类XObject.
我试图弄清楚为什么以下工作:
TextItem *textItem = new TextItem();
XObject *xItem = textItem;
delete textItem;
Run Code Online (Sandbox Code Playgroud)
但这不是:
TextItem *textItem = new TextItem();
XObject *xItem = textItem;
delete xItem;
Run Code Online (Sandbox Code Playgroud)
第二个示例失败delete,断言失败(_BLOCK_TYPE_IS_VALID).