你好,我正在尝试将一些旧代码移植到新标准。我有一个
std::complex<double> **data_2D;我需要把其中的一部分设定为零。我以前做过:
memset( &( data_2D[dims[0]-delta][0] ), 0, delta*dims[1]*sizeof( std::complex<double> ) );它发出了这样的警告:
clearing an object of non-trivial type 'class std::complex<double>'; use assignment or value-initialization instead如何用std::fill更改memset?我在双指针中迷失了方向。
下面是一个极简示例:
#include <iostream>
#include <complex>
#include <string.h>
int main() {
unsigned int dims[2]={10,10};
std::complex<double> *cdata_ = new std::complex<double>[dims[0]*dims[1]];
std::complex<double> **data_2D;
data_2D= new std::complex<double> *[dims[0]];
for( unsigned int i=0; i<dims[0]; i++ ) {
data_2D[i] = cdata_ + i*dims[1];
for( unsigned int j=0; j<dims[1]; j++ ) {
data_2D[i][j] = 0.0;
}
}
unsigned int delta=5;
memmove( &( data_2D[0][0] ), &( data_2D[delta][0] ), ( dims[1]*dims[0]-delta*dims[1] )*sizeof( std::complex<double> ) );
memset( &( data_2D[dims[0]-delta][0] ), 0, delta*dims[1]*sizeof( std::complex<double> ) );
return 0;
}发布于 2022-04-08 13:24:11
你不需要改变任何关于指针的东西。如果使用std::fill_n,只需注意参数的顺序不同,并且元素的数量,而不是字节数,都是预期的:
std::fill_n( &( data_2D[dims[0]-delta][0] ), delta*dims[1], 0 );然而,&...[0]具有与隐式数组到指针衰减相同的效果,因此可以同时编写它。
std::fill_n( data_2D[dims[0]-delta], delta*dims[1], 0 );我并不认为拥有data_2D的重要性。只需直接索引cdata_:
std::fill_n( cdata_ + (dims[0]-delta)*dims[1], delta*dims[1], 0 );或者,如果希望一个接口逐行和逐列索引,请将cdata_包装在一个类中,其中包含一个成员函数,该成员函数通过2D索引对数组进行索引。
如果您已经在进行现代化,我还建议您替换new。它应该是一个std::vector。
https://stackoverflow.com/questions/71797491
复制相似问题