有一段时间我只在源代码控制下使用了我的代码,但是我觉得将我的东西放在我的.vim文件夹中以及其他东西在回购中会很酷.(我显然不会将所有内容存储在我的仓库中,只包含各种配置文件,我的src目录,以及其他一些内容)
我能够设置一个repo罚款,然后将其推送到我的服务器,我可以从其他计算机访问它,但我无法将其克隆到我的其他计算机.当我尝试克隆它时失败,因为主目录不为空.有办法在这里做我想做的事吗?
我有一个使用PortAudio的程序.目前我正在启动它Pa_OpenDefaultStream(&stream, 0, 2, paFloat32, 44100, 256, audioCB, udata),但是当我编译并运行我的程序时,如果当前正在运行另一个程序(例如音乐播放器),它将不会播放声音.错误字符串是PortAudio error: Device unavailable
我认为我需要运行Pa_OpenStream,但我不确定我应该通过它来使它与其他程序一起运行.
作为参考,我尝试打印出可用设备上的信息,但我不知道如何处理这些信息.
Device 0
name /dev/dsp
hostAPI 0
maxInputChannels 16
maxOutPutChannels 0
defaultLowInputLatency 0.011610
defaultLowOutputLatency -0.117208
defaultHighInputLatency 0.046440
defaultHighOutputLatency 0.000000
defaultSampleRate 44100.000000
Device 1
name /dev/dsp1
hostAPI 0
maxInputChannels 16
maxOutPutChannels 0
defaultLowInputLatency 0.011610
defaultLowOutputLatency -0.117208
defaultHighInputLatency 0.046440
defaultHighOutputLatency 0.000000
defaultSampleRate 44100.000000
Default Device -1
Run Code Online (Sandbox Code Playgroud)
在写这个问题时,我也注意到maxOutputchannels的变化取决于是否有另一个程序试图播放声音.至少我认为这才是最重要的.我在关闭的另一个浏览器选项卡中有一个暂停的youtube视频,当我重新编写我的程序时,它打印出来:
Device 0
name /dev/dsp
hostAPI 0
maxInputChannels 16
maxOutPutChannels 16
defaultLowInputLatency 0.011610
defaultLowOutputLatency 0.011610
defaultHighInputLatency 0.046440
defaultHighOutputLatency 0.046440 …Run Code Online (Sandbox Code Playgroud) 我想将一个函数作为模板参数传递给另一个函数,以便以后可以存储和调用它.在某些情况下,我想为回调传递NULL,但我遇到了麻烦.以下是我希望能够做到的一个例子:
#include <iostream>
struct Foo {
int i;
};
template <typename T>
T* T_new() {
return new T();
}
Foo* Foo_new() {
return new Foo();
}
template <typename T, T* (*func)()>
T* T_new() {
if (func)
return func();
else
return NULL;
}
int main(void) {
// Works
Foo* f1 = T_new<Foo>();
std::cout << f1 << std::endl;
// Works
Foo* f2 = T_new<Foo, Foo_new>();
std::cout << f2 << std::endl;
// fails to compile, "no matching function for call to ‘T_new()’"
// …Run Code Online (Sandbox Code Playgroud) 我有一些C++课程,我想向Lua公开.我可以调用Widget:New()以返回带有metatable集的userdata到表中WidgetMeta.WidgetMeta它包含所有C++函数,并且它__index是自己设置的,所以我可以这样做:
w = Widget:New()
w:Foo() -- Foo is defined in C code
Run Code Online (Sandbox Code Playgroud)
这一切都很简单.
现在这是我无法弄清楚的部分.我希望能够将Lua定义的变量和函数放在我的userdata上,就像它是一个表一样.这显然不能直接完成.我不能将它放在userdata上,因为我希望每个用户数据都是唯一的.
w1 = Widget:New()
w2 = Widget:New()
function w1:Bar() print "Hello!" end -- Both functions unique
function w1:Baz() print "World!" end -- to their own userdata
Run Code Online (Sandbox Code Playgroud)
我目前的攻击计划是让metatable在其上有一个特殊的表,它在userdata和table之间进行映射,我可以在其中存储每用户数据函数和变量.问题是我不确定这样做的最佳方法是什么,或者是否有更好的解决方案.所以我的问题是双重的:当我设置我的__index和__newindex元方法时,我是用Lua代码在文本文件中编写它们并在运行剩下的东西之前运行它,还是直接从C语言中放入Lua代码我的程序中的字符串是通过luaL_loadstring,还是我用C接口来处理所有堆栈操作?第二,我该如何编写这个功能......但是一旦我决定采用哪种方式,我就会处理这个问题.
假设有三个标题AAA.h,BBB.h并且MyLib.h.MyLib.h需要包括两者AAA.h并BBB.h正常工作.
现在,它恰好BBB.h也包含AAA.h在其中,但这完全是由于实现,一个MyLib.h不应该关心的细节.
然而,错误的是,作者MyLib.h忽略了包括AAA.h而从不注意到.据我所知,这通常不会导致错误或警告.稍后,有人会更改实现细节,BBB.h以便AAA.h不再需要并因此删除.现在MyLib没有编译,因为库BBB的内部已经改变了.
有没有办法在这些情况下出错或发出警告?我怀疑(如果这是可能的话)它将在包含的标题中采用某种注释.
我正在尝试使用CMake为我使用Lua的项目构建生成make文件.当我运行make时,我收到此错误:
/path/to/my/project/luaudio/luaudio.c:1:17: fatal error: lua.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
在CMakeLists.txt文件中,我有以下几行,我认为会这样做,但显然它们还不够:
find_package(Lua51 REQUIRED)
set(Luaudio_INCLUDE_DIRS ${Luaudio_SOURCE_DIR} ${Lua51_INCLUDE_DIRS} PARENT_SCOPE)
include_directories(${Luaudio_INCLUDE_DIRS})
Run Code Online (Sandbox Code Playgroud)
Lua51_Include_Dirs似乎是空的(尝试运行它虽然消息命令不打印任何东西)所以我怀疑它只是找不到它.我需要指定在哪里寻找Lua吗?我的印象是find_package的重点在于它会在一个预定义的位置中查找,这样我就不需要指定它的具体位置.
(这是在Ubuntu机器上,我确实安装了Lua软件包.)
我为我正在编写的游戏编写了一个文件解析器,以便我自己更改游戏的各个方面(比如角色/舞台/碰撞数据).例如,我可能有这样的字符类:
class Character
{
public:
int x, y; // Character's location
Character* teammate;
}
Run Code Online (Sandbox Code Playgroud)
我设置我的解析器从文件读入数据结构,语法类似于C++
Character Sidekick
{
X = 12
Y = 0
}
Character AwesomeDude
{
X = 10
Y = 50
Teammate = Sidekick
}
Run Code Online (Sandbox Code Playgroud)
这将创建两个数据结构并将它们放在一个映射中<std::string, Character*>,其中键字符串是我给它的任何名称(在本例中为Sidekick和AwesomeDude).当我的解析器看到一个指向类的指针时,就像队友指针一样,它足够聪明,可以在地图中查找指向该数据结构的指针.问题是我不能宣布Sidekick的队友是AwesomeDude,因为它还没有被放入角色地图.
我正在尝试找到解决此问题的最佳方法,以便我可以将我的数据结构引用尚未添加到地图中的对象.我能想到的两个最简单的解决方案是:(a)添加转发声明数据结构的能力,或者(b)让解析器读取文件两次,一次用指针填充空数据结构,第二次到经过并填写他们.
(a)的问题是我也可以决定在类上调用哪个构造函数,如果我转发声明的东西,我必须让构造函数与其余数据分开,这可能会令人困惑.(b)的问题是我可能想在自己的文件中声明Sidekick和AwesomeDude.我必须让我的解析器能够读取一个文件列表而不是一次只读一个(我猜这不是很糟糕,虽然有时候我可能想得到一个文件列表来读取文件).(b)还有一个缺点,即无法使用构造函数本身后面声明的数据结构,但我认为这不是一个大问题.
哪种方式听起来更好?有没有第三种选择我没有想过?似乎应该有一些聪明的解决方案,使用指针引用或绑定或其他......: - /我认为这有点主观,基于我想给自己的功能,但任何输入都是受欢迎的.
对于我目前的项目,我一直在为Lua包装器编写大量的C/C++.其中大量是简单的setter和getter,所以我设法编写了一些模板,可以很容易地生成这些,如下所示:
// Class Return Field
template <typename T, typename U, U T::*Member>
int luaU_get(lua_State* L)
{
T* obj = luaW_check<T>(L, 1);
luaU_push<U>(L, obj->*Member);
return 1;
}
static luaL_reg Foo_Table[] =
{
...
// Now I can just use this generic template to avoid
// writing simple getter functions
{ "getbar", luaU_get<Foo, Bar, &Foo::bar> },
...
};
Run Code Online (Sandbox Code Playgroud)
我想为任意函数的简单函数包装器做类似的事情.例如,能够这样做会很高兴:
template <typename T, typename U, U (T::*Func)(), typename... Args>
int luaU_func(lua_State* L)
{
// ...?
}
static luaL_reg Foo_Table[] =
{
...
{ …Run Code Online (Sandbox Code Playgroud) 让它改变我所做的一切真的很烦人.我宁愿它从底部弹出.我已经google了一下,没有找到办法做到这一点,或者一个有帮助的插件.
我试图弄清楚为什么这个例子不能编译.我的理解是,如果没有显式设置静态变量,那么它默认为0.在下面的五个示例中,其中四个行为与我期望的一样,但是被注释掉的那个将不会编译.
#include <iostream>
class Foo
{
public:
static int i;
static int j;
};
template <int n>
class Bar
{
public:
Bar(int) { }
static int i;
};
static int i;
int Foo::i;
int Foo::j = 1;
template <> int Bar<2>::i;
template <> int Bar<3>::i = 3;
int main(int argc, char** argv)
{
std::cout << "i " << i << std::endl;
std::cout << "Foo::i " << Foo::i << std::endl;
std::cout << "Foo::j " << Foo::j << std::endl;
//std::cout << "Bar<2>::i …Run Code Online (Sandbox Code Playgroud)