小编Tot*_*son的帖子

将C++对象传递给Python

这个问题是关于如何将C++对象传递给在(C++)嵌入式Python解释器中调用的python函数.

以下C++类(MyClass.h)用于测试:

#ifndef MyClassH
#define MyClassH
#include <string>

using std::string;
class MyClass
{
    public:
                        MyClass(const string& lbl): label(lbl) {}
                        ~MyClass(){}
        string          getLabel() {return label;}

    private:
        string          label;
};
#endif
Run Code Online (Sandbox Code Playgroud)

暴露C++类的python模块可以通过以下Swig接口文件生成:

%module passmetopython

%{    #include "MyClass.h"    %}

%include "std_string.i"

//Expose to Python
%include "MyClass.h"
Run Code Online (Sandbox Code Playgroud)

下面是使用python模块的Python脚本

import passmetopython as pmtp

def execute(obj):
    #This function is to be called from C/C++, with a
    #MyClass object as an argument
    print ("Entering execute function")
    lbl = obj.getLabel();
    print ("Printing from within python execute …
Run Code Online (Sandbox Code Playgroud)

c++ python swig

28
推荐指数
1
解决办法
1870
查看次数

如何在Windows Ubuntu子系统中安装一个子驱动的驱动器

我在Windows上的开发环境包括子文件夹,即文件夹c:\ MyBuild可以被子文件替换为驱动器号,比如t:

在Ubuntu子系统终端中,我可以将文件夹绑定到mount,就像这样

sudo mount --bind  /mnt/c/MyBuild /mnt/t
Run Code Online (Sandbox Code Playgroud)

这在当前shell中工作正常,但它不是持久的,如果从外部调用bash脚本,则此挂载不存在,因此脚本可能会失败,文件夹/ mnt/t/someFolder不存在.

我确实将以下内容添加到/ etc/fstab中,但它没有按预期工作

 /mnt/t /mnt/c/MyBuild none defaults,bind 0 0
Run Code Online (Sandbox Code Playgroud)

如何在Windows Ubuntu子系统中使此挂载持久化?

windows ubuntu subst fstab

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

当主数据集为空时更新 VCL TClientDataSet(详细信息集)

我有一个主 TClientDataSet,它也是一个详细数据集。这个数据集被命名为 MasterDetail1。

另一个数据集 DetailSet1 是 MasterDetail1 的详细信息集。

DetailSet1 的查询是

SELECT * 
FROM readoutprobe_containers 
WHERE id = :parent_container
Run Code Online (Sandbox Code Playgroud)

其中parent_container参数的值是通过从主数据集中获取其数据的 DataSource 获得的。

只要 MasterDetail1 数据集有多条记录,DetailSet1 数据集就会显示相应的数据。

但是,当 MasterDetail1 数据集为空时,DetailSet1 数据集显示 MasterDetail1 数据中最后填充的记录,这是错误的数据。当主集没有数据时,明细集也应该不显示数据。

当主数据为空时如何实现空的DetailSet1?

c++ vcl tclientdataset dbexpress

7
推荐指数
0
解决办法
74
查看次数

CMake,VTK8和Embarcaderos Clang编译器

目前Embarcadero版本的C++ Builder(10.2.3)附带了Clang 32和64位C/C++编译器.据称Clang版本为3.3,(http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Win32_Clang-enhanced_Compilers).

我正在研究使用这些编译器和CMake编译VTK 8.0和其他库.

但是,CMake附带的"系统"CMake文件(Windows-Embarcadero.cmake)没有为Clang配置,而是为较旧的bcc32编译器配置.

Embarcadero建议将他们发布的"Windows-Embarcadero.cmake"文件(http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_CMake_with_C%2B%2B_Builder)复制到CMakes Modules/Platform文件夹,并覆盖Windows-随CMake一起提供的Embarcadero.cmake文件.我正在使用CMake 3.10.

但是,遵循Embarcaderos的建议不允许编译太多.除了不能正常工作之外,新的.cmake文件还断开了对旧bcc32编译器(!)的支持.

尝试使用CMake和bcc32x(clang32)编译器配置VTK8源时的第一个错误是:

CMake Error at CMake/vtkModuleMacros.cmake:586 (target_compile_features):
target_compile_features no known features for CXX compiler

"Embarcadero"

version 7.30.36015.
Call Stack (most recent call first):
CMake/vtkModuleMacros.cmake:660 (vtk_add_library)
Common/Core/CMakeLists.txt:399 (vtk_module_library)
Run Code Online (Sandbox Code Playgroud)

在第586行深入了解CMake/vtkModuleMacros可显示错误发生的位置:

  function(vtk_add_library name)
  add_library(${name} ${ARGN} ${headers})
  # We use compile features to specify that VTK requires C++11.
  # We request a series of C++11 features that will conform to VTK's
  # desired minimum requirements.
  # - cxx_override …
Run Code Online (Sandbox Code Playgroud)

c++ c++builder cmake clang

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

用SWIG包装共享指针对象不能访问类成员函数

我有一个C ++ CameraManager类,它管理Camera对象的列表。相机对象由std :: list作为共享指针管理,即每个列表项的类型为:shared_ptr <Camera>。

我可以从CameraManager对象获取Camera作为

 std::shared_ptr<Camera> c = cameraManager.getCamera();
Run Code Online (Sandbox Code Playgroud)

使用Swig创建Python模块,以上内容翻译为python代码:

  camera = cameraManager.getCamera()
Run Code Online (Sandbox Code Playgroud)

但是,上面的camera Python对象不允许我访问任何Camera类函数。Python说的是一种类型的对象:####处的'std :: shared_ptr *类型的Swig对象

在Swig接口文件中添加以下内容

%include <std_shared_ptr.i>
%shared_ptr(Camera)
Run Code Online (Sandbox Code Playgroud)

包括之前

%include "aiCamera.h"
Run Code Online (Sandbox Code Playgroud)

不要在生成的Python模块中更改行为。有什么想法可能会丢失吗?

附加信息:C ++代码使用typedef:

typedef CameraSP std::shared_ptr<Camera>;
Run Code Online (Sandbox Code Playgroud)

Camera类是从基类派生的,该基类实际上是空的。

class MVR_API MVRObject
{
public:
                                     MVRObject();
                                     MVRObject(const MVRObject& obj);
    virtual                         ~MVRObject();

};
Run Code Online (Sandbox Code Playgroud)

该代码使用VS 2013和CMake进行编译。CMake代码如下所示:

set_source_files_properties(${PyModule}.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties(${PyModule}.i PROPERTIES SWIG_FLAGS "-threads")

SWIG_ADD_LIBRARY(${PyModule}
    TYPE MODULE 
    LANGUAGE python 
    SOURCES ${PyModule}.i
    )


SWIG_LINK_LIBRARIES (${PyModule}
    ${PYTHON_LIB_FOLDER}/Python37.lib    
    dslFoundation
    aimvr
)

# INSTALL PYTHON BINDINGS
# Get the python site packages …
Run Code Online (Sandbox Code Playgroud)

c++ python swig shared-ptr

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

用于计算“保留”库存项目的 SQL 查询

我们正在为名为 readoutprobes 和 readoutprobekits 的项目创建一个库存系统。下面的模式使用itemsitemkits两个词进行了简化。

在此处输入图片说明

一个物品包,是一个或多个物品的预定义集合,即一个套件。在套件中,特定类型的物品只能出现一次。一个套件,通常包含约 40 件物品。套件中物品的定义由itemkit_item表捕获。套件的库存记录在itemkit_containers表中。

itemkit_container跟踪物理项目容器。相反,它假设使用一组物理项目正确地“组装”了一个物理项目包,但我们不知道是哪些。填充时,itemkit_containers 记录中的“填充”字段设置为 true。

物品的库存由item_containers表跟踪。它的存在由容器体积监控。当体积为 0 时,容器被认为是空的。

从item_container表中获取特定物品的体积> 0的物理物品容器的数量,对于套件也是如此

我们希望获得每个项目的“保留计数”编号,以反映套件库存。

例如,假设我们有一个名为 A 的项目,其计数为 42。如果我们正在创建一个包含名为 A 的项目和相应的 itemkit_container 的 itemkit,我们希望“reserved”的计数为 1,对于 item一种。

项目的“主查询”如下所示:

SELECT items.*,         
    ic.item_count
FROM items
LEFT JOIN (
    SELECT p.id, COUNT(*) item_count, ic.item_id
    FROM  items AS p, item_containers AS ic
    WHERE p.id = ic.item_id AND ic.volume > 0
    GROUP BY p.id
    ) AS ic   
    ON ic.item_id …
Run Code Online (Sandbox Code Playgroud)

mysql sql inventory dbexpress sqlfiddle

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

与 i7 处理器相比,使用 Windows API CreateWaitableTimer 休眠在 Xeon 上的执行方式不同

我正在开发一个需要持续约 1 毫秒睡眠的程序。睡眠用于生成长度约为 1 毫秒的硬件脉冲。

我正在使用以下代码进行睡眠

void usleep(__int64 usec)
{
  HANDLE timer;
  LARGE_INTEGER ft;
  ft.QuadPart = -(10*usec); // Convert to 100 nanosecond interval, negative value indicates relative time

  timer = CreateWaitableTimer(NULL, TRUE, NULL);
  SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0);
  WaitForSingleObject(timer, INFINITE);
  CloseHandle(timer);
}
Run Code Online (Sandbox Code Playgroud)

取自这里

当我在 Intel i7 上使用上面的代码(使用 Embarcaderos bcc32 编译器)时,通过 1000 (1ms) 我得到一个睡眠,我使用Poco 的时间戳函数测量到大约 1ms。代码本身在一个线程中执行。

代码如下所示:

    mDebugFile <<  std::setprecision (17) << mPulseEventTime.elapsed()/1000.0 << "\t" << 0 << "\n";
    setHigh(false);
    mDebugFile <<  std::setprecision (17) << mPulseEventTime.elapsed()/1000.0 << …
Run Code Online (Sandbox Code Playgroud)

c++ windows time c++builder

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

如何使用bump2version创建自定义版本标签

我们使用bump2version来对Gitlab中的构建和发布进行版本控制,使用简单的major.minor.patch(1.1.17)格式。

然而,有时,使用自定义版本格式(例如 1.1.17-test-1)在常规管道之外创建版本很有用。

在当前版本 1.1.17 上尝试使用如下所示的 bubble2versions 命令行标志:

bump2version.exe  --search 1.0.17 --replace 1.0.17-testing --verbose --new-version 1.0.17-test-1 part
Run Code Online (Sandbox Code Playgroud)

不要给出任何错误,但会在管理版本字符串的所有文件中产生错误的版本字符串。

.bumpversion.cfg 文件如下所示:

[bumpversion]
current_version = 1.0.17

[bumpversion:file:CMakeLists.txt]
search = MVR_VERSION "{current_version}"
replace = MVR_VERSION "{new_version}"

[bumpversion:file:VERSION.txt]
search = {current_version}
replace = {new_version}

[bumpversion:file:installer/mvr.iss]
search = #define MyAppVersion "{current_version}"
replace = #define MyAppVersion "{new_version}"
Run Code Online (Sandbox Code Playgroud)

在应该更改版本字符串的每个文件中,更改如下所示:

set(MVR_VERSION "MVR_VERSION "1.0.17"" )
Run Code Online (Sandbox Code Playgroud)

这是不对的。正确的搜索/替换是

set(MVR_VERSION "1.0.17-test-1" )
Run Code Online (Sandbox Code Playgroud)

关于如何使用凹凸2版本标志来实现自定义版本有任何提示吗?

python versioning bump2version

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

添加 swig pythoncode 以在 Python 对象上设置 thisown 标志

我有一个 swigged C++ 类容器MyContainer,保存MyObject类型的对象,也是一个 C++ 类。

以下是C++头代码(freemenot.h

#ifndef freemenotH
#define freemenotH
#include <vector>
#include <string>

using std::string;
class MyObject
{
    public:
                        MyObject(const string& lbl);
                        ~MyObject();
        string          getLabel();

    private:
        string          label;
};

class MyContainer
{
    public:
                    MyContainer();
                    ~MyContainer();
        void        addObject(MyObject* o);
        MyObject*   getObject(unsigned int t);
        int         getNrOfObjects();

    private:
        std::vector<MyObject*>   mObjects;
};

#endif
Run Code Online (Sandbox Code Playgroud)

这是源代码(freemenot.cpp

#include "freemenot.h"
#include <iostream>
using namespace std;

/* MyObject source */
MyObject::MyObject(const string& lbl)
:
label(lbl)
{ cout<<"In object ctor"<<endl; …
Run Code Online (Sandbox Code Playgroud)

c++ python swig

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

在标准容器线程上调用size()安全吗?

我有一个使用标准列表容器的缓冲区。

工人在一侧推动元素,而另一侧从另一侧弹出。这两个线程在访问容器之前都使用互斥量。

为了查看性能,我需要查询容器的大小。但是,如果不需要的话,使用互斥量查询大小似乎有点过分。

问题是,有必要吗?

文档对调用size()进行了说明(在“数据竞争”部分下: 没有包含的元素被访问:同时访问或修改它们是安全的。

c++ stl thread-safety race-condition stdlist

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