这个问题是关于如何将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) 我在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子系统中使此挂载持久化?
我有一个主 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?
目前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 ++ 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) 我们正在为名为 readoutprobes 和 readoutprobekits 的项目创建一个库存系统。下面的模式使用items和itemkits两个词进行了简化。
一个物品包,是一个或多个物品的预定义集合,即一个套件。在套件中,特定类型的物品只能出现一次。一个套件,通常包含约 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) 我正在开发一个需要持续约 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) 我们使用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版本标志来实现自定义版本有任何提示吗?
我有一个 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) 我有一个使用标准列表容器的缓冲区。
工人在一侧推动元素,而另一侧从另一侧弹出。这两个线程在访问容器之前都使用互斥量。
为了查看性能,我需要查询容器的大小。但是,如果不需要的话,使用互斥量查询大小似乎有点过分。
问题是,有必要吗?
文档对调用size()进行了说明(在“数据竞争”部分下: 没有包含的元素被访问:同时访问或修改它们是安全的。