我有一个将“模拟域”转换为体素阵列(3D像素)的功能。每个体素可以是0或1,或至少false
或true
。
由于域可能非常大,因为离散化步骤可能非常小,因此需要非常大的内存。
我使用我的体素阵列来使用FFTW3执行散射模拟(在这种情况下,如果函数可以在double[2]
的数组上工作(FFTW3已知的复数类型,那么我可以执行但是当我使用我的体素数组来执行“简单”操作(例如体积分数估算)时,我只希望我的数组是我可以使用的最小类型,所以布尔数组就是这样的细
我在考虑以下内容:
#include <iostream>
int N = 10 ;
template<typename T>
void voxelizator(T* & Voxels) {
// N = total number of voxels, stored in a row-major 1D array
if (Voxels==NULL) Voxels = new T[N] ; //
for (int n = 0 ; n < N ; n++) Voxels[n] = T(0) ;
{ // Code to voxelizate the space -- DUMB condition
for (int n = 0 ; n<N ; n++) if (n%2==0) Voxels[n] = T(1) ;
}
}
int main()
{
int * voxOfInt = NULL ;
std::cout << "Array of int :" << std::endl ;
voxelizator(voxOfInt) ;
std::cout << "Done" << std::endl ;
for (int n = 0 ; n < N ; n++) std::cout << n << "\t" << voxOfInt[n] << std::endl ;
delete[] voxOfInt ;
bool * voxOfBool = NULL ;
std::cout << "Array of boolean " << std::endl ;
voxelizator(voxOfBool) ;
std::cout << "Done" << std::endl ;
for (int n = 0 ; n < N ; n++) std::cout << n << "\t" << voxOfBool[n] << std::endl ;
delete[] voxOfBool ;
}
但是当我使用double [2]数组(来自FFTW3的复数)(或者像本例中的int [2])调用此函数时,会触发错误ISO C++ forbids casting to an array type 'double[2]'
。
...
typedef double complex [2] ;
...
// in main {}
complex * voxOfArray = NULL ;
std::cout << "Array of an array " << std::endl ;
voxelizator(voxOfArray) ; // It fails to call the T(0) at compile time, but i would be more than happy to explain g++ what is T(0) for int[2] ...
std::cout << "Done" << std::endl ;
for (int n = 0 ; n < N ; n++) std::cout << n << "\t" << voxOfArray[n] << std::endl ;
delete[] voxOfArray ;
问题是:我在哪里可以给g ++收件人进行类型转换:
注意: 一个类型的函数调用操作符对我来说似乎很奇怪,但我知道它可以正常使用我已经使用的以下符号函数(请在这里插入狗的图片做一些化学反应并说“我不知道我是什么的做“)
template <typename T> int sign(T value) {
return (T(0) < value) - (value < T(O)) ;
}
答案 0 :(得分:0)
如果您使用的是C ++ 11: 您可以使用辅助结构,如:
struct voxel_t {
double val_[2];
voxel_t() : val_{0.0, 0.0}{};
explicit voxel_t(bool b): val_{double(b), 0.0}{};
};
template<typename T>
void voxelizator(T* Voxels) {
// N = total number of voxels, stored in a row-major 1D array
if (Voxels==NULL) Voxels = new T[N]{} ; // performs below initialization
//for (int n = 0 ; n < N ; n++) Voxels[n] = T(0) ; // no longer needed
{ // Code to voxelizate the space
for (int n = 0 ; n<N ; n++) if (is_Matter(n)) Voxels[n] = T{true};
}
}
ideone上的示例用法。
这解决了double [2]的情况,对于bool你不需要做任何特别的事情。