我试图创建一个简单的控制台应用程序来试用Qt的XML解析器.我在VS2008中启动了一个项目并得到了这个模板:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
由于我不需要事件处理,我想知道如果我忽略创建QCoreApplication并运行事件循环,是否会遇到麻烦.文档声明在大多数情况下建议使用它.
然而,为了好奇,我想知道如何在事件循环上执行一些通用任务然后终止应用程序.我无法谷歌相关的例子.
每个人都知道你不应该直接比较花车,而是使用公差:
float a,b;
float epsilon = 1e-6f;
bool equal = (fabs(a-b) < epsilon);
Run Code Online (Sandbox Code Playgroud)
我想知道在分割中使用它之前是否同样适用于将值比较为零.
float a, b;
if (a != 0.0f) b = 1/a; // oops?
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我还需要与epsilon进行比较吗?
长话短说:我正在用C++开发一个计算密集型图像处理应用程序.它需要在从较大图像中提取的小像素块上计算图像变形的许多变体.该程序运行速度不如我想的那么快.分析(OProfile)显示变形/插值函数占用CPU时间的70%以上,因此尝试优化它似乎是显而易见的.
到目前为止,我正在使用OpenCV图像处理库完成任务:
// some parameters for the image warps (position, stretch, skew)
struct WarpParams;
void Image::get(const WarpParams ¶ms)
{
// fills matrices mapX_ and mapY_ with x and y coordinates of points to be
// inteprolated.
updateCoordMaps(params);
// perform interpolation to obtain pixels at point locations
// P(mapX_[i], mapY_[i]) based on the original data and put the
// result in pixels_. Use bicubic inteprolation.
cv::remap(image_->data(), pixels_, mapX_, mapY_, CV_INTER_CUBIC);
}
Run Code Online (Sandbox Code Playgroud)
我编写了自己的插值函数并将其放入测试工具中以确保在我进行实验时的正确性,并将其与旧的相比较.
我的功能运行得很慢,这是预料之中的.一般来说,这个想法是:
旧功能在我的Wolfdale Core2 Duo上的时间为25us.新的拿了587us(!).我急切地把我的巫师帽子打开并开始破解代码.我设法删除所有分支,省略一些重复计算,并将3个嵌套循环转换为坐标映射中的一个.这就是我想出的:
void …Run Code Online (Sandbox Code Playgroud) 我有一个由3个项目组成的解决方案.一个是静态库,两个是基于控制台的.exe文件,它们依赖于此库并链接到该库.他们的设置似乎相同.我建立了其中一个:
1> ------ Build build:项目:masksample,配置:Debug Win32 ------
1>编译...
1> stdafx.cpp
1>编译...
1> masksample.cpp
1>编译显示资源...
1>链接...
1> LINK:C:\ Users\DarekSz\Praca\cci\Debug\masksample.exe未找到或未由最后一个增量链接构建; 执行完整链接
1>嵌入清单...
1>掩码样本 - 0错误,0警告
==========构建:1成功,0失败,1最新, 0跳过==========
然后我继续建造另一个:
1> ------ Build build:项目:calibsample,配置:Debug Win32 ------
1>编译...
1> stdafx.cpp
1>编译...
1> calibsample.cpp
1>编译显示资源...
1>链接...
1>链接:C:\ Users\DarekSz\Praca\cci\Debug\calibsample.exe未找到或未由最后一个增量链接构建; 执行完整链接
1>创建库C:\ Users\DarekSz\Praca\cci\Debug\calibsample.lib和对象C:\ Users\DarekSz\Praca\cci\Debug\calibsample.exp
1>嵌入清单...
1> calibsample - 0错误,0警告
==========构建:1成功,0失败,1最新,0跳过==========
为什么链接器这次会创建.lib和.exp文件?是否有一些选项可以打开和关闭我在不知情的情况下激活它?
我试图在Visual C++ 2010中实现智能相等测试宏类型模板函数时遇到了一些麻烦,该函数与VS中关于模板函数的默认参数的错误有关.我通过在额外的函数中包装参数的值来修复它,但现在我发现我不能在一行中使用该函数两次!
头文件:
// example.h
#pragma once
#include <limits>
namespace myspace
{
// Need to define this separately to avoid a Visual Studio bug
template<typename T> T epsilon() { return std::numeric_limits<T>::epsilon(); }
// A generic equality test
template<typename T> inline bool smartEqual(
const T &v1,
const T &v2,
const T &eps = epsilon<T>())
{
return (v1 == v2);
}
// Template specialization for floating-point numbers
template<> bool smartEqual<float>(
const float &v1,
const float &v2,
const float &eps); …Run Code Online (Sandbox Code Playgroud) 可以将旧的C风格cvMat矩阵传递给cvSave()函数,以便轻松写入XML文件.此函数不接受新的C++样式cv::Mat和cv::Mat_矩阵.
OpenCV参考有一个关于XML持久性的部分,但是这三个类(FileStorage,FileNode和FileNodeIterator)缺少任何描述或示例,我无法弄清楚如何从界面中使用它们.
谢谢.
编辑:这其实涉及很多其他的功能,在新的C++接口的OpenCV,为2.1版本.文档在某些地方非常差,函数参数不一致,并且用户组要么不知道,要么比回答问题有更好的事情要做.我将坚持使用旧的C接口一段时间.文件更好,更不用说O'Reilly的书了.
在C++中,我可以静态初始化一个数组,例如:
int a[] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
有一种简单的方法可以将动态分配的数组初始化为一组立即值吗?
int *p = new int[3];
p = { 1, 2, 3 }; // syntax error
Run Code Online (Sandbox Code Playgroud)
...或者我必须手动复制这些值吗?
在我的应用程序中,我有以下类层次结构:
class Word
{
...
}
template <typename T> class Dictionary
{
...
};
class WordDictionary : public Dictionary<Word>
{
Q_OBJECT
...
}
Run Code Online (Sandbox Code Playgroud)
WordDictionary类解析需要很长时间的字典.我正在一个单独的线程中运行解析函数,我希望它能够不时地通知GUI线程,以根据正在解析的当前行号提供进度更新.这就是我希望它成为Q_OBJECT的原因.我试图使基类Dictionary成为Q_OBJECT,但得到的消息是不支持Q_OBJECT模板.当我删除宏,只留下WordDictionary作为Q_OBJECT时,我得到一堆一般形式的错误消息:
\ GeneratedFiles \发布\ moc_dictionary.cpp(44):错误C2039: 'staticMetaObject':不是'词典'中的一员
与
[
T =字
]
有什么办法可以让我的模板派生的WordDictionary类成为Q_OBJECT而不是硬编码里面的模板函数,产生了很多样板代码吗?
编辑:将模板声明更改为:
template <typename T> class Dictionary : public QObject
Run Code Online (Sandbox Code Playgroud)
使代码编译.我不确定我是不是做了一些愚蠢的事情,如果能够正常工作的话.
我正在试图弄清楚QXmlStreamReader如何为我正在编写的C++应用程序工作.我要解析的XML文件是一个大字典,结构复杂,有很多Unicode字符,所以我决定尝试一个带有更简单文档的小测试用例.不幸的是,我碰壁了.这是示例xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<firstname>John</firstname>
<surname>Doe</surname>
<email>john.doe@example.com</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Jane</firstname>
<surname>Doe</surname>
<email>jane.doe@example.com</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Matti</firstname>
<surname>Meikäläinen</surname>
<email>matti.meikalainen@example.com</email>
<website>http://fi.wikipedia.org/wiki/Matti_Meikäläinen</website>
</person>
</persons>
Run Code Online (Sandbox Code Playgroud)
...而我正在尝试使用以下代码解析它:
int main(int argc, char *argv[])
{
if (argc != 2) return 1;
QString filename(argv[1]);
QTextStream cout(stdout);
cout << "Starting... filename: " << filename << endl;
QFile file(filename);
bool open = file.open(QIODevice::ReadOnly | QIODevice::Text);
if (!open)
{
cout << "Couldn't open file" << endl;
return 1;
}
else
{
cout << "File opened OK" << …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个实例QTimer,其timeout()信号连接到主窗口对象中的一个插槽,导致它定期被调用.插槽用相机拍照并将其保存到磁盘.
我想知道QTimer当接收器(主线程上的窗口对象)当前正忙时(如同拍摄并保存前一张图片),如果发出信号(来自执行的单独线程,我推测)会发生什么.在前一个呼叫终止后,呼叫是否排队并执行?整个想法是让它定期运行,但这些调用可以排队,然后当控制返回到事件循环时随机调用,导致混乱吗?我怎么能避免呢?从理论上讲,插槽应该快速执行,但是假设硬件有一些问题并且存在停顿.
我希望在这种情况下调用被丢弃而不是排队,更有用的是能够在发生时作出反应(警告用户,终止执行).
c++ ×8
qt ×4
opencv ×2
xml ×2
arrays ×1
c ×1
c++11 ×1
console ×1
exp ×1
linker ×1
matrix ×1
optimization ×1
qobject ×1
qt-signals ×1
qt4 ×1
qtcore ×1
sse ×1
templates ×1
visual-c++ ×1
xml-parsing ×1