将3D数组传递给类(转换问题)

时间:2014-06-13 22:10:17

标签: c++ arrays class templates

我正在尝试写一堂课' 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])

我想问题在于我天真的模板实现。我已经尝试了多种不同的方式,但我似乎无法找到解决方案,如果有人可以帮助我,我会非常感激!

1 个答案:

答案 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] = ...;

他们有很多解决方案,但,忘记所有这些指针和旧式内存分配。我保证,我用于这样编程,我改变了,我很高兴这些容器存在,不再需要花费数小时来调试编译时错误消息或运行时意外崩溃

并且,不,如果使用得当,则(几乎)没有时间开销。