小编use*_*005的帖子

C++ - 为std :: vector <double>创建新的构造函数?

我编写了一个包含std::vector<double>实例的自定义容器类- 效果很好.为了与其他API兼容,我想将容器的内容导出为std::vector<double>副本.目前这有效:

MyContainer container;
....
std::vector<double> vc(container.begin(), container.end());
Run Code Online (Sandbox Code Playgroud)

但如果可能的话希望能够写:

MyContainer container;
....
std::vector<double> vc(container);
Run Code Online (Sandbox Code Playgroud)

我可以(轻松地)创建这样的std::vector<double>构造函数吗?

c++

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

Python ctypes:Python文件对象< - > C FILE*

我正在使用ctypes用Python包装一个C库(我已经控制过).我想用声明包装一个C函数:

int fread_int( FILE * stream );
Run Code Online (Sandbox Code Playgroud)

现在; 我想在python中打开文件,然后使用Python文件对象(以某种方式??)来访问底层的FILE*对象并将其传递给C函数:

# Python
fileH = open( file , "r")
value = ctypes_function_fread_int( ????? )
fileH.close()
Run Code Online (Sandbox Code Playgroud)

Python文件< - > FILE*映射是否​​可能?

乔金 -

python ctypes

9
推荐指数
2
解决办法
6229
查看次数

分发python应用程序

我正在编写一个非常大的Python应用程序; 该应用程序实际上在很大程度上是用C和C++(Qt)编写的几个共享库的包装.我在没有管理员权限的情况下'安装'这个,所以包括共享库,二进制文件和Python模块在内的所有内容都必须位于非标准位置,即我有这样的情况:

  1. /funny/path/lib中的共享库
  2. 安装在/ funny/path/python/lin中的Python模块
  3. python解释器本身也可能位于/非标准/位置

整个事情是作为开源分发的,我需要找到一种相当优雅和简单的方法来设置必要的环境变量.整个过程与版本控制软件一起分发; 因此必须在某些"本地添加"中设置环境变量,例如:

#!/bin/bash
export LD_LIBRARY_PATH /funny/path/lib:$LD_LIBRARY_PATH
export PYTHONPATH /funn/path/python/lib:$PYTHONPATH

# 
exec python main.py
Run Code Online (Sandbox Code Playgroud)

但我在Python编程是有原因的 - 我厌恶这些shell脚本.任何关于最优雅的方式的观点都会很好.

乔金 -

python

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

Java:使用依赖项加载共享库

我使用JNA用Java包装共享库(用C语言编写).共享库是内部编写的,但该库使用来自另一个外部库的函数,这又取决于另一个外部库.所以情况是这样的:

ext1 < - ext2 < - 内部

即内部使用外部库ext2,它再次使用外部库ext1.我试过的是:

System.loadLibrary("ext1");
System.loadLibrary("ext2");
NativeLIbrary.loadLibrary("internal",xxx.class);  
Run Code Online (Sandbox Code Playgroud)

加载库"ext2"时,此方法失败并显示"UnresolvedException"; 链接器抱怨存在于库"ext1"中的符号.所以它认为System.loadLibrary()函数不会使"ext1"中的符号全局可用?当使用stdlib函数dlopen()时:

handle = dlopen( lib_name , RTLD_GLOBAL );
Run Code Online (Sandbox Code Playgroud)

在@lib_name中找到的所有符号都可用于后续加载中的符号解析; 我想我喜欢的东西类似于java品种System.loadLibrary()?

问候 - Joakim Hove

java shared-libraries jna

8
推荐指数
2
解决办法
6111
查看次数

带转换的C++重载[]

我有一个表示布尔值向量的C数据结构; 由于我无法控制的原因,bools'在内部存储为具有两个神奇值(不是0和1 ......)的整数,表示真和假.我创建了一个包装这个C结构的C++类,它运行得很好.我已经实现了set()get()方法:

void Class::set(size_t index , bool value) {
     if (value)
        c_ptr[index] = SPECIAL_TRUE_VALUE;
     else
        c_ptr[index] = SPECIAL_FALSE_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

这没关系; 但理想情况下我想重载operator [],但是我不清楚如何/如果我能做到这一点 - 由于bool和整数值之间的特殊转换?

c++ overloading

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

C - 从C++模拟'mutable'

我有这样的C结构:

struct my_struct {
   int i;
   double d;
   struct expensive_type * t;
};
Run Code Online (Sandbox Code Playgroud)

创建此结构的实例并将其初始化为:

struct my_struct * my_new( int i , double d) 
{
    struct my_struct * s = malloc( sizeof * s);
    s->i = i;
    s->d = d;
    s->t = NULL;
    return s;
}   
Run Code Online (Sandbox Code Playgroud)

计算struct expensive_type * t成员是非常昂贵的,可能不需要 - 它只是初始化为NULL- 然后根据需要计算:

const struct expensive_type * my_get_expensive( const struct my_struct * s) 
{
    if (!s->t)
       s->t = my_expensive_alloc( s->i , s->d );
    return s->t;  
 }
Run Code Online (Sandbox Code Playgroud)

在C++中,我会用 …

c const mutable

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

从共享库中获取枚举定义

我正在使用ctypes访问用C编写的共享库.共享库的C源包含类似的枚举

enum {
   invalid = 0,
   type1   = 1,
   type2   = 2
} type_enum;
Run Code Online (Sandbox Code Playgroud)

在Python方面,我打算只为各种枚举值定义整数常量,例如:

INVALID = 0
TYPE1 = 1
TYPE2 = 2  
Run Code Online (Sandbox Code Playgroud)

然后在调用C函数的Python代码中使用这些数字"常量".这似乎工作确定,但我会强烈倾向于直接从共享库得到的数值为枚举(反省); 但是在共享库上使用例如nm它似乎不包含任何符号'invalid','type1'或'type2'.所以我的问题是:

  1. 是否有可能从共享库中的枚举定义中提取数值 - 或者在编译完成后将整个枚举概念"放在地板上"?
  2. 如果共享库中存在枚举值 - 如何从Python/ctypes访问它们?

问候 - Joakim

c python ctypes

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

Jsoncpp - 当 Json::reader 超出范围时,非常简单的测试会崩溃

我已经下载并安装了 jsoncpp 库。然后我尝试在我自己的应用程序中使用该库:

#include <json/json.h>

void parseJson() {
   Json::Reader reader;
} 

int main(int argc, char ** argv) {
   parseJson();
   exit(0);
}
Run Code Online (Sandbox Code Playgroud)

该程序编译和链接正常,但在运行时因 SIGSEGV 而崩溃。gdb 回溯如下所示:

(gdb) bt
#0  0x0000003a560b7672 in __gnu_cxx::__exchange_and_add () from /usr/lib64/libstdc++.so.6
#1  0x00000000004031e9 in std::string::_Rep::_M_dispose (this=0xffffffffffffffe9, __a=@0x7fffbfe60e57)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:232
#2  0x0000000000403236 in ~basic_string (this=0x7fffbfe60fb0)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:478
#3  0x00000000004038d4 in ~Reader (this=0x7fffbfe60eb0) at /private/joaho/Parser/opm-parser/external/json/json-cpp/include/json/reader.h:23
#4  0x0000000000402990 in parseJson () at /private/joaho/Parser/opm-parser/opm/parser/eclipse/ExternalTests/ExternalTests.cpp:51
#5  0x00000000004029ab in main (argc=1, argv=0x7fffbfe610c8)
at /home/user/Parser/opm-parser/opm/parser/eclipse/ExternalTests/ExternalTests.cpp:56
Run Code Online (Sandbox Code Playgroud)

即对我来说,它似乎在析构函数中崩溃。据我所知 Json::Reader 没有它自己的析构函数,所以这必须是一个默认的析构函数。如您所见,我正在运行一个相当旧版本的 g++ - 这可能是问题所在吗?

c++ jsoncpp

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

使用std :: find与用户提供的谓词-自制find()重载

我有一个本质上std::vector<T>带有某些附加功能的类。该类具有find(const T& value )将返回第一次出现的索引value或-1的方法:

int my::find(const T& value) {
    auto iter = std::find(this->data.begin(), this->data.end(), value);
    if (iter == this->data.end())
        return -1;

    return std::distance(this->data.begin(), iter);
}
Run Code Online (Sandbox Code Playgroud)

都好。然后,我想创建一个find()接受任意谓词而不是值的重载-我已经尝试过:

int my::find(const std::function<bool(const T&)>& pred) {
    auto iter = std::find(this->data.begin(), this->data.end(), pred);
    ...
}
Run Code Online (Sandbox Code Playgroud)

并且:

template <typename P>
int my::find(P&& pred) {
    auto iter = ...
}
Run Code Online (Sandbox Code Playgroud)

但是这两种情况都无法编译,因为“编译器”试图predpred类型值的向量中查找,而不是应用于pred值,即,当我实例化时,my<int>出现如下编译器错误:

/usr/include/c++/5/bits/predefined_ops.h:194:17: error: no match for ‘operator==’ (operand types are ‘int’ …
Run Code Online (Sandbox Code Playgroud)

c++

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

Python classmethod和(?)instancemethod

我编写了一个Python类来解析专门的文本格式.

class Parser(object):

   def __init__(self):
       # Initialize parser instance


   def parseFile(self , filename):
       pass

   def modifyParser(self , *args , **kwargs):
       pass 

   #Classmethod has same name as instance method - this does not work.
   @classmethod 
   def parseFile(cls , filename)
       parser = Parser( )
       return parser.parseFile( filename )
Run Code Online (Sandbox Code Playgroud)

如上所示,可以使用该modifyParser方法修改解析器- 但在大多数情况下,我将只使用Parser实例,因为它来自Parser.__init__().我希望能够做到这一点:

# Parse file using 'custom' parser:
parser = Parser( )
parser.modifyParser( ... )
result = parser.parseFile("file.input")


# Parse using the default parser - do not explicitly instantiate an …
Run Code Online (Sandbox Code Playgroud)

python

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

标签 统计

c++ ×4

python ×4

c ×2

ctypes ×2

const ×1

java ×1

jna ×1

jsoncpp ×1

mutable ×1

overloading ×1

shared-libraries ×1