英特尔并行工作室 2015 C++中的 2D 动态分配全局阵列



所以我利用这个网站来获得我认为正确的语法,但我仍然卡住了。

我在当前使用 FFT 的项目中带来了一些预先存在的快速 hartley 转换代码,除了 FHT 的大小和重叠是硬编码的,我想使用我的 FFT 代码中的值在运行时动态设置大小。

这需要 2D 全局数组。

所以我在任何函数之外定义数组,以便全局:

`double         **mInput;`

在初始化函数中,我这样做:

'

kWindowSize = (int)fftlen; //fftlen is a global from my existing program
mInput = new double*[kWindowSize];
for (int i = 0; i < kWindowSize; ++i)
mInput[i] = new double[2];
printf("nmInput pointer: %x mInput value: %f", (void *)&mInput, mInput);
printf("nfirst sample: %f second sample %f", mInput[0][0], mInput[0][1]);`

但是,它在另一个函数中编译和运行良好:

`printf("nnn-->mInput pointer: %x mInput value: %f", (void *)&mInput, mInput);
printf("n-->first sample: %f second sample %f", mInput[0][0]);
printf("n-->second sample %f", mInput[0][1]);`

它在第二个 printf 状态(尝试访问 2d 数组中的值(崩溃,非法写入位置零。

似乎 for 循环中的新语句正在创建本地数组而不是全局数组?

自从我从这里获得动态分配语法以来,我开始怀疑这是否是英特尔编译器中的错误?

建议?

谢谢!

我已经接受了您对全局 2D 数组或双指针的想法,并且我已经这样做可能对您有所帮助,而无需使用vectorlistarray但将其包装到使用智能指针的模板类结构中。我做了这样的事情:

#include <memory>
template <typename T = double>
struct Buffer {
T* ptdatafield_ { nullptr };
T* ptdata_ { nullptr };
Buffer();
};
template<>
Buffer<double>::Buffer() {};
template<typename T = double>
class FFTBuffer {
public: 
std::unique_ptr< Buffer<T> > unique_ptr_buffer_ { nullptr };
union {
T** pprawbuffer_ { nullptr };                       
struct {
std::shared_ptr<T> sub_shared_BufferIndexi_;
std::shared_ptr<T> sub_shared_BufferIndexj_;
};
struct {
T* rawIndexi_;
T* rawIndexj_;
};
};
explicit FFTBuffer( const Buffer<T>& buffer );      
~FFTBuffer() {};
};
template<>
FFTBuffer<double>::FFTBuffer( const Buffer<double>& buffer ) :
unique_ptr_buffer_( std::make_unique<Buffer<>>( buffer ) ), 
rawIndexi_( buffer.ptdatafield_ ), rawIndexj_( buffer.ptdata_ ) {    
}
int main() {
Buffer<> buffer;
FFTBuffer<> fftBuffer( buffer );
Buffer<>* pBuffer = new Buffer<>();
FFTBuffer<> fftBuffer2( *pBuffer );
return 0;
}

现在这段代码确实按原样编译,但我还没有用值测试它或填充内部数组。我添加了使用无名称结构的公共联盟。如果对齐正确,它应该与二维数组(如 MxN 矩阵(中的行和列匹配。此类存储对Buffer对象的unique_ptr<>,该对象本身具有两个单独的指针,一个指针用于数组的每个维度。然后,它使用该Buffer对象在其无名称结构和双指针的内部公共联合中设置数据字段。这只是访问相同内存位置的多种方法。

这个想法是一般地形成这个协会......

//.....
int i, j;
(fftBuffer.unique_ptr_buffer_.get()->ptdatafield_[i], fftBuffer.unique_ptr_buffer_.get()->ptdata_[j]) =  
fftBuffer.pprawbuffer_[i][j] = 
(fftBuffer.rawIndexi_[i], fftBuffer.rawIndexj_[j] =
(fftBuffer.sub_shared_BufferIndexi_.get()[i], fftBuffer.sub_shared_BufferIndexj_.get()[j]) 

现在我没有实现或包含[]重载运算符或任何其他运算符,但它们应该不难实现。这应该有助于直观地查看 2D 数组如何在内存中线性存储,并在不需要"双 for 循环"的情况下访问或分配元素。

我将不胜感激,除了任何和所有关于为该算法设计此伪代码的意图的反馈,并对您的决定进行简短的描述性解释。我想听听为什么这是"好或坏"代码的利弊,它可以改进其设计和实现,以及这可能带来的其他复杂性。

-- 就我个人而言,我尽量避免使用独立的全局变量,除非它们是永不更改的 const 值,或者是静态全局变量,例如指向单例类对象的静态全局指针。

最新更新