【发布时间】:2022-01-15 00:06:19
【问题描述】:
我编写了一个 C++ 库来从电子设计自动化 (EDA) 工具中提取仿真数据(= 带有 (x,y) 或 (x,y,z) 分量的简单向量)。更具体地说,这些数据代表不同时间点的电信号。
C++ 库提供了多种方法。两个重要的是:
std::vector<std::string> getSignalNames() // Returns all signal names in the file
std::vector<std::vector<double>> getSignals() // Returns the actual data as M x N matrix (with M rows and N columns)
在 C++ 中使用该库可以完美运行并产生预期结果,例如:
getSignalNames():
Signal1
Signal2
getSignals():
1 1 1 2
2 1 2 3
Perl 程序员要求我也向他们提供该库,我决定使用the wrapper generator SWIG 来创建绑定。我通过the tutorial 工作,并且能够成功设置一个最小的工作示例。
基于示例,我为 C++ 库编写了完整的 SWIG 接口文件。包装器生成和构建过程运行顺利,我也可以毫无问题地使用getSignalNames():
// Perl snippet to read out signal names
my $parserPointer = new waveformparser::ScopeParser("input.file");
$signalNames = $parserPointer->getSignalNames();
foreach my $signalName ( @$signalNames ) {
print "$signalName\n";
}
// Output:
Signal1
Signal2
但是,我在使用getSignals()的返回值时遇到了麻烦:
// Perl snippet to read out the actual signal data
my $parserPointer = new waveformparser::ScopeParser("input.file");
$signalData = $parserPointer->getSignals();
foreach my $rowAsHashRef ( @$signalData ) {
print "reftype: " . reftype($rowAsHashRef) . "\n";
print "keys: " . keys(%$rowAsHashRef) . "\n"
}
// Output:
reftype: HASH
keys: 0
reftype: HASH
keys: 0
如您所见,在 Perl 中每一行都表示为哈希,但哈希中没有键。不过,当使用Perl's Data::Dumper 时,我可以看到每一行的正确数据类型:
my $parserPointer = new waveformparser::ScopeParser("input.file");
$signalData = $parserPointer->getSignals();
print Dumper $signalData;
// Output:
$VAR1 = [
bless( {}, 'waveformparser::vector_1d_double' ),
bless( {}, 'waveformparser::vector_1d_double' )
];
即,根据数据转储器,每行包含几列(即'waveformparser::vector_1d_double'),这些列在 SWIG 接口文件中定义如下:
...
%include "std_vector.i"
%template(vector_1d_double) std::vector<double>;
%template(vector_2d_double) std::vector<std::vector<double>>;
...
我现在的问题是:如何在 Perl 中访问这个“祝福”(包装)vector_1d_double 对象的元素?
我想,SWIG 会为这些对象提供方便的访问方法。即,底层 C++ 数据类型只是一个简单的双精度一维向量 (std::vector<double>)。
【问题讨论】:
-
您可能需要为
std::vector<std::vector<double>>编写一个类型映射,类似于为std::map<...>here 所做的工作 -
您不必编写包含
std_vector.i的类型图。您应该包含minimal reproducible example 以查看您的 .i 文件中是否有任何问题。例如,模板必须在通过%include处理代码头之前实例化。
标签: c++ perl vector double swig