小编Pie*_*BdR的帖子

将指针转换为整数

我正在尝试将现有代码调整为64位机器.主要问题是在一个函数中,前一个编码器使用void*参数,该参数在函数本身中转换为合适的类型.一个简短的例子:

void function(MESSAGE_ID id, void* param)
{
    if(id == FOO) {
        int real_param = (int)param;
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,在64位机器上,我收到错误:

error: cast from 'void*' to 'int' loses precision
Run Code Online (Sandbox Code Playgroud)

我想纠正这个问题,以便它仍然可以在32位机器上运行并且尽可能干净.任何的想法 ?

c++ 64-bit gcc casting 32-bit

77
推荐指数
5
解决办法
15万
查看次数

如何在编译时测试当前版本的GCC?

我想根据GCC的版本包含不同的文件.更准确地说,我想写:

#if GCC_VERSION >= 4.2
#  include <unordered_map>
#  define EXT std
#elif GCC_VERSION >= 4
#  include <tr1/unordered_map>
#  define EXT std
#else
#  include <ext/hash_map>
#  define unordered_map __gnu_cxx::hash_map
#  define EXT __gnu_cxx
#endif
Run Code Online (Sandbox Code Playgroud)

我不关心3.2之前的gcc.

我很确定在预处理时间定义了一个变量,我再也找不到了.

c c++ gcc versions

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

检查Python中的成员是否存在

我经常想检查对象是否有成员.一个例子是在函数中创建单例.为此,您可以这样使用hasattr:

class Foo(object):
    @classmethod
    def singleton(self):
        if not hasattr(self, 'instance'):
            self.instance = Foo()
        return self.instance
Run Code Online (Sandbox Code Playgroud)

但你也可以这样做:

class Foo(object):
    @classmethod
    def singleton(self):
        try:
            return self.instance
        except AttributeError:
            self.instance = Foo()
            return self.instance
Run Code Online (Sandbox Code Playgroud)

另一种方法更好吗?

编辑:添加了@classmethod...但请注意,问题不是关于如何制作单例,而是如何检查对象中是否存在成员.

编辑:对于该示例,典型用法是:

s = Foo.singleton()
Run Code Online (Sandbox Code Playgroud)

然后s是类型的对象,Foo每次都相同.并且,通常,该方法被多次调用.

python exception introspection hasattr

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

如何检查makefile中是否存在文件

我有一个makefile模板来编译单个DLL(对于插件系统).用户的makefile如下所示:

EXTRA_SRCS=file1 file2
include makefile.in
Run Code Online (Sandbox Code Playgroud)

makefile.in我有:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
Run Code Online (Sandbox Code Playgroud)

plugin.os要编译的主要C++文件在哪里.顺便说一句,文件结尾是.os为共享库编译的目标文件(即使用-fpic选项gcc)

现在,问题是额外的源可能(但不一定)是头文件.理想情况下,我想将它们添加为目标plugin.os和它们的依赖项file.cpp,但前提是它们存在.

该方法应适用于Windows和Linux,或至少适用于每个.但是,我只使用了GNU版本的make.

testing makefile compilation file gnu-make

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

如何在CLion中启用C++ 11?

我正在尝试在CLion中运行C++ 11代码,但它不起作用.它说:

...
    /projects/CLion/untitled/main.cpp:7:1: note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11
...
Run Code Online (Sandbox Code Playgroud)

我试图设置CMAKE_C_FLAGS-std=c++11-std=gnu++11,但我仍然有同样的问题.常规C++代码编译得很好.

我必须在CLion的CMake窗口中设置什么标志来编译我的C++ 11代码?

c++ cmake c++11 clion

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

除非将操作添加到工具栏,否则Qt5无法识别快捷方式

我有一个Qt4应用程序,菜单条目有快捷方式(没有什么花哨的东西,比如Ctrl+ O 打开文件,Ctrl+ S保存......).使用Qt5编译时,虽然操作附加到菜单栏,但快捷方式不起作用.

如果我将它们添加到工具栏中,它们会再次工作.

有一种简单的方法可以使它工作吗?我还可以将所有这些操作添加到附加到主窗口的操作列表中,但这很容易出错.

c++ user-interface keyboard-shortcuts qt-designer qt5

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

部分解析C++以获取特定于域的语言

我想创建一个域特定语言作为扩充C++语言.我将主要需要两种类型的结构:

  • 专用类型或声明的顶级构造
  • 代码内构造,即添加基元以使函数调用或成语更容易

该语言将用于科学计算目的,并最终将被翻译成普通的C++.选择C++似乎提供了一个很好的折衷方案:易用性,效率和各种库的可用性.

由于C++语法的复杂性,之前使用flex和bison的尝试失败了.现有的解析器仍然可能在某些构造上失败.所以我们想重新开始,但是要有更好的基础.

你知道类似的项目吗?如果你试图这样做,你会使用什么工具?主要陷阱是什么?你会在语法方面有什么建议吗?

c++ dsl parsing code-generation

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

如何在运行时更改现有QGLWidget的QGLFormat?

在我的应用程序中,用户可以更改OpenGL格式的属性(即双缓冲,多重采样,各种缓冲区的深度,......).

目前,我的应用程序中只有一个QGLWidget,如果用户更改了任何内容,我会销毁并重新创建窗口小部件.

现在,我想拥有多个小部件.因此,如果格式改变,我需要销毁/重新创建所有小部件.由于小部件可以采用各种配置,因此很难破坏/重新创建它们.那么有没有办法在运行时更改QGLWidget的格式?

或者,有没有办法用另一个替换一个小部件?(即销毁一个小部件并将一个新小部件准确放置在它所用的位置)

c++ opengl user-interface qt4 dynamic

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

Linux下使用Atlas在numpy中的线程错误

我有一个使用在Linux机器上运行的多进程模块的多进程(不是多线程!)应用程序.这个应用程序使用该numpy.linalg.solve函数,如果我尝试创建许多进程,那么我得到错误:

assertion !pthread_create( &(ROOT->pid), ATTR, ROOT->fun, ROOT ) failed, line 84 of file /build/buildd-atlas_3.8.4-9-amd64-jk6dgk/atlas-3.8.4/build/atlas-base/../..//src/pthreads/misc/ATL_thread_tree.c
Run Code Online (Sandbox Code Playgroud)

请注意,在我开始使用函数之前numpy.linalg,我没有遇到任何问题.

知道问题可能是什么?

编辑:我试过用scipy.linalg.solve,问题是一样的!

编辑:通过用blas替换地图集,问题就消失了.所以看来这个问题确实存在于地图集中

linux runtime-error numpy multiprocessing atlas

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

重载C++模板化函数

我认为以下代码应该工作,但g ++和clang ++都返回完全相同的错误(虽然Visual C++ 2012没有).

#include <iostream>
#include <tuple>

template <int N, typename T>
struct A { };

template <typename Tuple>
double result(const Tuple& t, const A<0, typename std::tuple_element<0, Tuple>::type>& a)
{
  return 0;
}

template <typename Tuple>
double result(const Tuple& t, const A<std::tuple_size<Tuple>::value-1,
                                      typename std::tuple_element<std::tuple_size<Tuple>::value-1,Tuple>::type>& a)
{
  return 1;
}

template <typename Tuple, int N>
double result(const Tuple& t, const A<N, typename std::tuple_element<N, Tuple>::type>& a)
{
  return 0.5;
}

int main()
{
  auto a = std::make_tuple(0, 1, 2., 3., …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading overload-resolution c++11

5
推荐指数
2
解决办法
318
查看次数