小编Max*_*and的帖子

如何从C++中过滤掉Lua中用户定义的全局变量?

考虑一下这个小的Lua测试脚本.

g1 = "Global 1"
g2 = "Global 2"

function test ()
  local l1
  print(g1,g2,l1)
end

test()
Run Code Online (Sandbox Code Playgroud)

假设您暂停执行print(g1,g2,l1)并从C++获取具有此C代码的所有全局变量:

lua_pushglobaltable(L);
lua_pushnil(L);
while (lua_next(L,-2) != 0) {
  const char* name = lua_tostring(L,-2);

  // How do I tell a user defined
  // global variable (now in name)
  // from all other environment variables?

  lua_pop(L,1);
}
lua_pop(L,1); // global table
Run Code Online (Sandbox Code Playgroud)

当我获得name全局条目时,如何判断这是否是脚本中用户定义的全局变量,如g1和g2?

由于用户可以自由编写脚本,我无法搜索特定的全局,我需要以某种方式区分它们.

c++ lua global-variables lua-5.2

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

Javascript - 传递一个带参数的函数作为参数

我正在清理一些脚本错误,并且有一个微妙的困境.

考虑以下代码行:

Session.Timer = window.setTimeout("TimeoutHandler(Session)", 1000);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为当Timeout尝试执行时TimeoutHandler(Session),它将不知道Session变量是什么(超出范围).

有没有办法将Session"值"转换为字符串数字,以便正确执行?

javascript callback parameter-passing

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

AVR 程序集 - 要屏蔽的位数

在我的 ATtiny84a AVR 汇编程序中,我最终在寄存器中得到了一个介于 0 和 7 之间的位数,例如 r16。现在我需要创建一个带有该位号集的掩码。为了使它更复杂,操作的时序必须相同,无论设置了什么位。

例如,如果 r16 = 5,结果掩码将为 0x20(第 5 位设置)。

到目前为止,我已经通过LSL将位移到位置并使用 r16(位号)作为循环计数器,然后为了保持准确的时序而不管位号,做一个NOP 8-r16 次的虚拟循环。

汇编指令SBR从掩码设置寄存器中的位,因此它不能被使用。汇编指令SBI根据位号在 I/O 寄存器中设置一个位,但它是一个常量,而不是寄存器(我可以使用 I/O 寄存器作为临时寄存器)。

然后使用掩码来清除内存位置中的位,因此如果有另一种解决方案可以从寄存器中的位号执行此操作,那么也可以。

我有另一种解决方案要尝试(基于移位和进位),但我希望有人有一个比循环和移位更优雅的解决方案。

assembly avr bitmask attiny

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

C++如何使用隐藏的默认构造函数初始化成员?

我有一个隐藏默认构造函数的类,强制使用带参数的构造函数.另一个类使用该类的2个实例:

typedef struct { ... } BAZ;

class Foo {
  private:
    Foo(void) {}

  public:
    Foo(BAZ a) { ... }
};

class Bar {
  private:
    Foo foo1;
    Foo foo2;

    Bar(void) {}

  public:
    Bar(BAZ a, BAZ b) : foo1(a), foo2(b) { ... }
};
Run Code Online (Sandbox Code Playgroud)

最明显的是变量foo1和foo2的声明将调用默认的Foo构造函数,但由于它是私有的,它不能并且会给编译器错误.

有没有办法阻止它尝试默认的Foo构造函数,只是等待Bar构造函数初始化它们?

我想避免使用new关键字(这将解决整个问题).

编辑:
似乎人们很难理解问题和困境.我会试着解释一下:

我想强制使用Foo(BAZ)构造函数,这意味着任何使用Foo(void)构造函数的尝试都会产生错误.

要隐藏默认构造函数,它将被声明为私有成员.如果有人试图使用默认构造函数Foo(),它将给出故意错误.

要不声明默认构造函数,只声明Foo(BAZ)不会阻止编译器创建公共默认构造函数.如果我将其声明为Foo(),则不会出错.到目前为止它的工作正常并且符合预期.

第二类Bar有两个Foo实例,但是当实例化Bar时,这些Foo成员将使用默认(隐藏)构造函数调用并生成错误.然后在Bar构造函数中,这两个实例将使用正确的公共构造函数Bar(BAZ a,BAZ b)初始化:foo1(a),foo2(b).这就是我要的.

有没有办法防止它在初始化Bar时调用Foo默认构造函数,所以Bar构造函数可以使用正确的Foo构造函数?

解决方案的工作,因为默认的构造函数永远不会被调用:

BAZ a = {...}
Foo *foo1 = new Foo(a);
Run Code Online (Sandbox Code Playgroud)

我希望这更清楚.

EDIT2:已解决 错误不在隐藏的Foo构造函数中,它是隐藏的Bar构造函数,试图使用隐藏的默认Foo构造函数.

Bar(void) : Foo(BAZ{}), Foo(BAZ{}) {}
Run Code Online (Sandbox Code Playgroud)

解决了它.

编辑3:
真正的问题似乎是在开发工具中.重新启动并手动清除缓存后,它就像C++ 14标准一样工作.

c++ constructor initialization atmelstudio c++14

-4
推荐指数
2
解决办法
572
查看次数