英特尔并行工作室 2015 C++中的 2D 动态分配全局阵列
2D dynamically allocated global array in C++ Intel Parallel Studio 2015
所以我利用这个网站来获得我认为正确的语法,但我仍然卡住了。
我在当前使用 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 数组或双指针的想法,并且我已经这样做可能对您有所帮助,而无需使用vector
、list
、array
但将其包装到使用智能指针的模板类结构中。我做了这样的事情:
#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 值,或者是静态全局变量,例如指向单例类对象的静态全局指针。
- 我无法在函数中动态分配 2D 数组
- 英特尔并行工作室 2015 C++中的 2D 动态分配全局阵列
- 在MPI中发送动态分配的2D数组的列
- 动态分配的 2D 数组
- 传递动态分配的 2D 字符数组会导致分段错误
- 错误在删除动态分配的2D数组期间发生
- 如何在C 中创建动态分配的2D结构阵列
- 尝试将文本文件加载到动态分配的 2D 数组中时出现'Segmentation fault'错误
- 动态分配的输入,并在C 中输出2D阵列
- C++ 2D 动态阵列分配
- 复制动态分配的 2D 数组
- 从动态分配的2D数组指针中获取行
- 动态分配 2D 数组,无需使用任何循环
- 动态分配2D矢量C++
- 如何在C++中动态分配2D数组
- 这是动态分配的2d数组的正确实现吗
- 在类中动态分配对象指针的2D数组
- 常规 2D 阵列与动态分配的 2D 阵列
- c++11 使用 std::fill 来填充 2D 动态分配的数组
- Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递