我正在尝试写一堂课' STFT'在短时间内完成FT。它调用fftw3.h函数,它输出一个double * [2]数组,我想创建这些数组的数组。所以我认为以下是一个合适的转换函数(这是一个精简版本):
void STFT::Transform(double ***transform) {
//stuff
}
然而,当我用说
打电话时transform[100][100][2]
我收到错误消息:
error: cannot convert double (*)[100][2]' to `double***
环顾四周后,我想我已经找到了一个使用模板Storing C++ template function definitions in a .CPP file的解决方案,但我在实施它时遇到了麻烦,主要是找出了我放置通用类型指示器的位置' T&#39 ;.我的更新功能是:
STFT.hpp
class STFT {
public:
template<int N>
void Transform(double transform[][N][2]);
};
STFT.cpp
using namespace std;
template<int N>
void STFT::Transform(double transform[][N][2]) {
cout << "IT WORKS" << endl;
}
,函数调用在main.cpp中:
STFT stft;
double transform[100][100][2];
stft.Transform(transform);
但是,这似乎不起作用。错误消息是:
undefined reference to `void STFT::Transform<100>(double (*) [100][2])
我想问题在于我天真的模板实现。我已经尝试了多种不同的方式,但我似乎无法找到解决方案,如果有人可以帮助我,我会非常感激!
答案 0 :(得分:3)
您将此标记为C++
,但您使用的是C风格(且容易出错)的数据存储。所以使用&#34; true&#34; c ++解决方案:使用标准库的容器。
在这里,据我所知,你需要一对价值矩阵,所以为什么不使用例如:
typedef std::pair<double,double> myElements;
typedef std::vector<std::vector<myElements>> myContainer;
myContainer data; // instanciation
....
void STFT::Transform(myContainer& d) {
}
可以通过以下方式填充元素:
for( size_t i=0; i<100; i++ )
{
std::vector<myElements> new_vec;
for( size_t j=0; j<100; j++ )
{
double val1 = ...;
double val2 = ...;
new_vec.push_back( std::make_pair(val1,val2) );
}
data.push_back( new_vec );
}
如果您关注性能,可以预先将矢量的大小分配给元素数。
如果std::pair
不舒服,您可以使用具有编译时大小优势的std::array
:
typedef std::array<double,2> myElements;
然后,您只需执行以下操作,而不是使用.first
和.second
进行访问:
data.at(i).at(j)[0] = ...;
data.at(i).at(j)[1] = ...;
或者,如果您确定索引值,并且不想要运行时边界检查:
data[i][j][0] = ...;
data[i][j][1] = ...;
他们有很多解决方案,但请,忘记所有这些指针和旧式内存分配。我保证,我也用于这样编程,我改变了,我很高兴这些容器存在,不再需要花费数小时来调试编译时错误消息或运行时意外崩溃
并且,不,如果使用得当,则(几乎)没有时间开销。