我试图编写一个静态回调函数,该函数经常从同一个类中的另一个静态函数调用.我的回调函数需要emit一个信号,但由于某种原因,它根本就没有这样做.我把它放在一个调试器下,slot永远不会被调用.但是,当我将用于emit数据的代码放在非静态函数中时,它可以工作.有没有理由我不能从静态函数发出信号?我已经尝试声明类的新实例并调用emit函数但没有运气.
class Foo
{
signals:
emitFunction(int);
private:
static int callback(int val)
{
/* Called multiple times (100+) */
Foo *foo = new Foo;
foo.emitFunction(val);
}
void run()
{
callback(percentdownloaded);
}
};
Run Code Online (Sandbox Code Playgroud)
我已经发布了一些基本代码来演示我试图做的事情.我会根据要求发布完整的代码.
编辑:我发布完整的代码,因为这是一种奇怪的情况.http://pastebin.com/6J2D2hnM
有没有一种方法来确定传递给一个模板变量的类型,并调用基于函数,如果它是一个int或std::string等...?
例如
template <class T>
struct Jam
{
Jam(T *var)
{
if (typeid(var) == typeid(std::string*)
*var = "Hello!";
else if (typeid(var) == typeid(int*)
*var = 25;
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试使用该代码时,我收到一个错误invalid conversion from const char* to int.我怀疑这是因为编译器将模板"扩展"为单独的函数,当我指定结构的新实例时,throw Jam<std::string>(&setme);它检测到该var* = 25语句并拒绝编译.
有没有正确的方法来做到这一点?也许有宏观警卫?谢谢.
大多数汇编程序利用4个通用寄存器eax ebx ecx edx,但我发现,很多时候我需要使用超过4个寄存器来轻松地完成我的任务,而不必push和pop从堆栈得多.由于我的程序无意使用FPU或MMX寄存器进行浮点计算或"预期用途",在程序中使用这些额外的寄存器是否可以接受?
例如.使用xmm0一个循环递增计数器腾出ecx寄存器做其他事情.
我试图检测可移动设备的插入并使用NT服务检索所述设备的驱动器号.我已经成功检测到设备的插入和移除,但是无法设置一个DEV_BROADCAST_VOLUME允许我从卷中获取驱动器号,GUID等的结构.
case SERVICE_CONTROL_DEVICEEVENT:{
switch(evtype){
case DBT_DEVICEARRIVAL:{
DEV_BROADCAST_VOLUME *hdr = (DEV_BROADCAST_VOLUME*) evdata;
ofstream log ("C:\\log.txt", ios::app);
log << hdr->dbcv_devicetype;
log.close();
}
break;
Run Code Online (Sandbox Code Playgroud)
上面的代码片段编译并正确运行,但是当我插入一个闪存驱动器时,hdr->dbcv_devicetype日志作为55555和DBT_DEVTYP_VOLUME(这是USB驱动器)的值被定义为2(hdr->dbcv_devicetype应该相同,DBT_DEVTYP_VOLUME因为我插入了一个闪存驱动器).由于某种原因要么DBT_DEVTYP_VOLUME没有正确初始化,要么我正在做的其他事情是错误的.我使用Windows 7与Visual Studio 2011 C++.
我试图将 QT 中的 libCurl 链接到 Windows 7 x64 上的 C++ 程序,但是当我尝试链接时libcurldll.a,我收到了大量错误。我尝试用 GCC 编译一个类似的函数g++ -LC:\MinGW\lib -lcurldll,编译时没有错误。我在 QT 和 GCC 中使用以下代码。
void MainWindow::on_pushButton_2_clicked()
{
CURL *curl;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
Run Code Online (Sandbox Code Playgroud)
QT 给了我一个巨大的错误列表,我已将其粘贴到此处。一些关键错误是我在文件中tlsthrd.c:-1: error: undefined reference to 'EnterCriticalSection@4'使用将项目链接到curl 库。知道为什么会发生这种情况吗?干杯。LIBS += -LC:\MinGW\lib -lcurldll.pro
编辑:经过更深入的研究,似乎在libmingw32.a提供对用于多线程的函数的引用方面存在一些问题。我应该尝试替换库文件吗?如果是这样,为什么 GCC 使用相同的库文件可以正确编译,而 QT 却不能?
我正在尝试学习汇编(更像是在挣扎),并且遇到了字节、字、双字等数据类型。
真正让我困惑的是你什么时候知道使用一个而不是另一个。显然您想使用最保守的选项,但我怎么知道选择一个字节而不是一个字呢?例如 1 个字 = 16 位或 2 个字节。这是否意味着我可以在 1 个单词中放入 16 个字符?所以为了保存字母表,我需要声明 2 个单词?
寄存器(16 位、32 位和 64 位)也是如此。我知道您可以使用较小的寄存器,例如al和 ,ah而不是eax在操作较小尺寸的数据时。对于 16 位寄存器,您能否将比字大的数据类型移入其中,因为它是 16 位,因此可以容纳 16 位字?
围绕这整个概念我很困难。如果有人碰巧有我可以查看的任何好的资源或信息,那就太好了。干杯!
有时,当我使用C++/CI进行编程时,最终多次调用相同的函数,我想知道检查所有这些调用的错误的最有效方法是什么?使用if else语句会占用大量代码并且看起来很难看.我想出了自己检查错误的方法,也许有更好的方法可以使用.
int errs[5] = {0};
errs[0] = functiona(...);
errs[1] = functiona(...);
...
errs[5] = functiona(...);
for (int i = 0; i < 5; i++)
{
if (err[i] == 0)
MAYDAY!_wehaveanerror();
}
Run Code Online (Sandbox Code Playgroud)
注:据我所知,使用try及catch可能对C更好++,因为它会通过在第一个错误抛出异常的解决了这个问题,但这个问题是,它是不是有很多的返回错误代码,如功能兼容Windows API.谢谢!
是否有任何功能允许您在Windows中创建快捷方式,就像您可以在Linux中创建符号链接一样?我最好希望能够编辑目标和名称之类的东西,而不是每次因为更新而想要更改某些内容时都必须重新创建一个全新的快捷方式.
我尝试.lnk在文本编辑器中打开一个文件,这是一大堆gobbelty gook.我想知道为什么它是半二进制,因为Linux上的快捷方式就像一个.ini文件,简单易用.我担心,如果我通过数据嬉戏,我可能会破坏某种校验和,并且快捷方式将无法工作,这就是为什么我想知道是否有一个特定的API应该被调用以修改这些对象.
更新:我找到了一个函数来查询快捷方式数据MsiGetShortcutTarget() http://msdn.microsoft.com/en-us/library/windows/desktop/aa370299(v=vs.85).aspx,但还没有创建或修改快捷方式.
我有一个回调函数,它接受 avoid *作为参数来传递参数,并且我想将向量传递给该函数。该函数将被多次调用,因此在回调过程完成后,我希望能够迭代所有已push_back()通过回调进行编辑的元素。
static void cb(void *data)
{
vector<int> *p = static_cast<vector<int>*>(data); //Attempting to convert *void to vector<int>
p->push_back(1);
}
int main()
{
vector<int> a(10); //Max of 10 push_back()s? vector<int> a; gives memory error.
cb((void*)&a.at(0));
cout << a.at(0); //Gives a random number of 6 digits or higher
}
Run Code Online (Sandbox Code Playgroud)
a.at(0)问题是,在回调后调用时,它的值并不正确为“1” ,而只是一些随机数。
我正在尝试使用C++编译一个应用程序,该应用程序无需.net框架或必须安装Visual Studio运行时.我做了一些研究,发现MSDN上的这篇文章展示了如何编译本机C++代码.但是当我按照这个例子时,在没有visual studio运行时的计算机上运行生成的可执行文件后,我MSVCP100D.dll的计算机缺少一个错误.我知道可以通过键入-static-libgcc -static-libstdc++生成静态二进制文件来修复与GCC类似的错误.是否可以使用Visual Studio 2010执行此操作?我希望这样做的原因是我喜欢使用Visual Studio IDE,但我希望我的代码可以移植到其他操作系统,如UNIX.谢谢!
注意:我认为发布我为编译目的而编译的代码可能会有所帮助.
#include <iostream>
int main()
{
std::cout << "Hello world";
}
Run Code Online (Sandbox Code Playgroud)