小编Wat*_*oto的帖子

如何查找从PSQL中的另一个表继承的子表

在PSQL中,有没有一种很好的方法来查找从另一个表继承的所有表?理想情况下,我可以从SQL查询中获取数据,但此时,我对任何可靠的方法都很满意.

postgresql

20
推荐指数
2
解决办法
1万
查看次数

如何将对象列表从C++传递给Lua?

我是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)

c++ lua object

12
推荐指数
1
解决办法
7704
查看次数

Lua,C++和穷人的子类

我是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)

c++ oop lua

11
推荐指数
2
解决办法
2670
查看次数

我应该如何记录用C++代码编写的Lua API /对象模型?

我正在为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++ lua documentation-generation

9
推荐指数
1
解决办法
1153
查看次数

是否在运行时或编译时评估了typeid(T)?

我无法在任何地方找到这个看似简单的问题的答案.

以下C++函数是否使用RTTI?它当然不必,但我想知道是否有保证在编译时确定typeid.

template <typename T>
const char *getName()
{
   return typeid(T).name();   // Resolved at compile time?
}
Run Code Online (Sandbox Code Playgroud)

c++ templates rtti

6
推荐指数
2
解决办法
2029
查看次数

为Lua声明变量和范围问题

我是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'严格'模块的略微修改版本.这似乎让我想到了我想去的地方,我会稍微改进一下消息,使它们更适合我的特定环境.

lua scope

5
推荐指数
1
解决办法
4441
查看次数

减少C++(或x-treme x-macros)中的代码重复

我正在使用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)

c++ c-preprocessor x-macros

5
推荐指数
1
解决办法
860
查看次数

Python、numpy 和类型提示:一个悲惨的故事

我正在尝试使用 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)

axiskind、 并且order没有类型(并且返回 Any 也有点蹩脚......这个函数真的可以返回任何类型吗?)

结果,我的代码中大约有一半的行存在这样的级联类型错误,因此我的代码充满了# type: ignore指令。

我知道 Python …

python types numpy

5
推荐指数
0
解决办法
501
查看次数

为什么一个人工作而一个人崩溃?

这让我疯了一个多星期.下面是来自游戏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)

c++ lua

4
推荐指数
1
解决办法
213
查看次数

va_args和64位

我是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)

我尝试了很多变种,包括: …

c++ linux 64-bit printf

3
推荐指数
1
解决办法
6480
查看次数

在Lua中检测陈旧的C++引用

我是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)

c++ lua

2
推荐指数
1
解决办法
1642
查看次数

PostgreSQL表设计 - 如何避免重用ID

我正在使用Postgres数据库设计一个具有相当复杂的桌面设计的应用程序,并且我坚持一点,我希望有人可以提供建议.

我有几个表,每个表都有一个功能ID(或fid).不同类型的实体具有不同的属性模式,因此我必须为每种类型创建不同的表.但是,我想确保fids在所有实体类型中都是唯一的.

如果我有三个实体类型,Entity1/2/3,由以下3个表表示:

Entity1             Entity2             Entity3
    fid                 fid                 fid
    attribute1          attribute2          attribute3
Run Code Online (Sandbox Code Playgroud)

如何确保系统中的任何位置都没有重复的fid?

谢谢!

sql postgresql

1
推荐指数
1
解决办法
905
查看次数

C++中的新建,删除和子类

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).

c++ oop memory-management new-operator

1
推荐指数
2
解决办法
967
查看次数