小编Nob*_*ody的帖子

在Eclipse CDT(Juno/Kepler/Luna)索引器中启用C++ 11

如何在Juno/Kepler/Luna中的Eclipse CDT索引器上启用对新C++标准的支持?

c++ eclipse-cdt c++11

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

避免在std :: shuffle中进行自我赋值

当使用glibcxx的已检查实现时,我偶然发现了以下问题:

/usr/include/c++/4.8.2/debug/vector:159:error: attempt to self move assign.
Objects involved in the operation:
sequence "this" @ 0x0x1b3f088 {
  type = NSt7__debug6vectorIiSaIiEEE;
}
Run Code Online (Sandbox Code Playgroud)

我已经减少到这个最小的例子:

#include <vector>
#include <random>
#include <algorithm>

struct Type {
        std::vector<int> ints;
};

int main() {
        std::vector<Type> intVectors = {{{1}}, {{1, 2}}};
        std::shuffle(intVectors.begin(), intVectors.end(), std::mt19937());
}
Run Code Online (Sandbox Code Playgroud)

追踪问题我发现shuffle想要std::swap一个自己的元素.由于Type是用户定义的并且没有为其std::swap指定专门化,因此使用默认值创建临时operator=(&&)值并使用它来传输值:

  _Tp __tmp = _GLIBCXX_MOVE(__a);
  __a = _GLIBCXX_MOVE(__b);
  __b = _GLIBCXX_MOVE(__tmp);
Run Code Online (Sandbox Code Playgroud)

由于Type没有明确给出operator=(&&)它默认是通过"递归"在其成员上应用相同的操作来实现的.

问题出现在交换代码的第2行,__a__b指向同一个对象,该对象在代码中生效__a.operator=(std::move(__a)),然后在检查的实现中触发错误 …

g++ c++11

27
推荐指数
2
解决办法
676
查看次数

for_each给出两个(或n个)相邻元素

是否有一个标准的实现for_each,它调用元素和范围中的下一个元素?

例如,取范围{0, 1, 2, 3, 4, 5},我想f用每个元素及其后继者调用一个函数:{f(0, 1), f(1, 2), f(2, 3), f(3, 4), f(4, 5)} 注意最后一个元素是如何被省略的,因为它没有后继元素.

如果对n个后继者进行泛化,那么它也会很好.

到目前为止,我总是用迭代器的手写循环来解决这个问题.但是,我想更多地遵循C++ 11范围的基础或std::for_each避免锅炉板代码.

例子

// today: handwritten loop
for(Range::iterator current = range.begin(); current != range.end(); ++current) 
   f(*current, *std::next(current));

// near future: wrapped version
for_each_pair(range.begin(), range.end(), f);

// slightly further future: generalized version
for_each_tuple<n>(range.begin(), range.end(), f);
Run Code Online (Sandbox Code Playgroud)

附加问题

可以改进函数的名称.对我来说for_each_pair/ tuple听起来应该返回范围大小为n的所有子集(这本身就是我想要解决的另一个问题).所以我想对更好的名字提出一些建议:

for_each_adjacent<n>
Run Code Online (Sandbox Code Playgroud)

c++ algorithm foreach

24
推荐指数
3
解决办法
2852
查看次数

C# - 增加数字并保持前面的零

我需要制作一个40位的计数器变量.它应该开始0000000000000000000000000000000000000001
并增加到
0000000000000000000000000000000000000002

当我使用int该类时,它会切断所有零.问题是我需要递增数字,然后将其转换为字符串,并使用正确的前导零数.总大小应为40位数.所以如果我打50例如,它应该是这样的:

0000000000000000000000000000000000000050

我怎么能这样做并保留零?

c# int increment

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

是否可以就地调整VBO的大小?

标题说明了一切,但为了清楚起见我会添加一些额外的单词.

在这种情况下,调整大小意味着:

  • 在旧的vbo结束时获得更多的存储空间
  • 将旧数据保存在前面
  • (希望不要复制,但至少不要在CPU端,这意味着驱动程序应该处理这个)

编辑

至于解释一些更多的细节并证明我的问题:
我会将(正手)未知大小的数据存储到VBO,但我只知道一个非常粗略估计的上限(在异常条件下10-100倍甚至更多) ).

当然我知道我存储了多少数据,当我完成它时,所以存储数据会很好,直到我发现我的VBO太小并调整它然后再继续存储.

这就是为什么我不想复制(特别是不在CPU端):
我在GPU上做这一切以获得交互式帧速率.当我不得不复制时,它很慢甚至不可能,因为没有足够的空间.最糟糕的是通过CPU复制数据,从而将所有内容通过总线传递到具有足够大小的新内存区域,然后glBufferData使用新大小的VBO和新内存区域作为源.那将是性能杀手.

绕开

我通过准确估计所需空间来规避问题.但是我会让这个问题在一个星期内无法回答,看看是否有人对此有另一个暗示,因为我对解决方案不太满意.

opengl vbo

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

如何在QMake中启用消毒杀菌剂?

如何在QMake的.pro文件中启用消毒剂的使用?

我找到了几个QMAKE_CXXFLAGS自我修改的资源,但介绍性博客文章说:

它被安排在开发分支(Qt 5.2),因为它是一个新功能,但你应该很好地挑选它,例如Qt 5.0.然后,您可以使用-address-sanitizer配置Qt,并为您自己的应用程序运行qmake CONFIG + = address_sanitizer.

但是,添加CONFIG+=address_sanitizer似乎没有效果.

c++ qt qmake sanitizer qt5

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

调整窗口大小以适合内容

我有一个QGLWidget,我想调整大小到给定的分辨率(大于包含窗口).我的意图是,窗口会扩展,直到小部件适合内部,但无法找到方法.

我在调整QGLWidget的大小后尝试了几个命令,使其工作没有成功.我将在此列出结果:

  • 什么都不做:Widget重叠整个窗口.最终它将调整大小以适应较小的窗口
  • mainWindow.adjustSize():窗口小部件调整大小为(0,0)
  • mainWindow.resize(mainWindow.sizeHint()): 往上看
  • mainWindow.resize(mainWindow.minimumSizeHint()): 往上看

我也读过这个帖子,在执行mainWindow调整之前我需要运行事件循环来重新计算新的大小,所以我插入QCoreApplication::processEvents这样做,没有任何可见的效果.

那么如何通过窗口小部件调整窗口大小?

编辑

GLWidget不是窗口的唯一窗口小部件.它与分组盒一起嵌入分离器中.

qt qlayout

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

glEnd无效操作无故障?

我已经在GL课程上工作了一段时间,突然间它开始出错了.在尝试解决这些问题一段时间后,我编写了一个生成相同行为的简短测试程序:

#include <GL/glut.h>
#include <iostream>

#define CHECK_GL_ERR() printError(__LINE__)

void printError(int line)
{
        GLenum err = glGetError();
        if(err != GL_NO_ERROR)
        {
                std::cerr << "GL error on line " << line << ": " << gluErrorString(err) << std::endl;
        }
}

void displayFunc()
{
        CHECK_GL_ERR();
        glBegin(GL_POINTS);
        CHECK_GL_ERR();
        glVertex3f(0, 0, 0);
        CHECK_GL_ERR();
        glEnd();
        CHECK_GL_ERR(); //line 23
        exit(0);
}

int main(int argc, char **argv)
{
        glutInit(&argc, argv);
        glutInitWindowSize(300, 300);
        glutCreateWindow("Test");

        glutDisplayFunc(displayFunc);

        glutMainLoop();
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,它给出了输出:

GL error on line 23: invalid operation
Run Code Online (Sandbox Code Playgroud)

所以似乎glEnd();导致错误.文档说:

如果执行glEnd而没有前面的glBegin,则会生成GL_INVALID_OPERATION. …

c++ opengl

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

如何在异常后干净地停止多进程python程序?

我有一个Python程序,有几个进程(现在只有2个)和线程(每个进程2个).我想捕获每个异常,特别是在Ctrl + c上干净地关闭我的程序,但我无法让它工作.每次发生异常时,程序都会停止但不会正确关闭,从而使我无法使用命令行.

我到目前为止在伪代码中尝试过的是:

try:
    for process in processes:
        process.join()
except:
    pass #Just to suppress error-messages, will be removed later
finally:
    for process in processes:
        process.terminate()
Run Code Online (Sandbox Code Playgroud)

但正如我已经说过没有运气.还要注意,我得到两个进程的异常错误消息,所以它们都停止了我相信吗?

也许我还应该提一下,大多数线程在监听管道时都被阻止了.

编辑 所以我几乎让它工作.我需要try:每个线程并确保线程正确连接.只有一个缺陷:Exception KeyboardInterrupt in <module 'threading' from '/usr/lib64/python2.7/threading.pyc'> ignored关闭时.这是在主进程的主线程中引发的.这个线程已经完成,这意味着它已经通过了最后一行代码.

python exception-handling multiprocessing

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

获取迭代器范围的每个第n个元素

是否有一个迭代器的标准实现(意思是stdlib或boost)包装另一个迭代器并且只给出它的每个第n个元素?

我首先想到的是,使用拟合谓词和boost :: filter_iterator是可能的,但是谓词只获取值而不是基本迭代器,所以它无法告诉起始距离.

编辑
提供更多信息:迭代器应与std::transform或等函数兼容std::copy.所以它应该像stdlib迭代器一样使用.

类似的问题:
C++/STL:std :: transform与给定的步幅?
非单元迭代器使用非随机访问迭代器

c++ boost iterator std

7
推荐指数
2
解决办法
2363
查看次数