Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数初始化类内的动态数组 作为练习,我将我的硕士论文的时域有限差分法转换成了从MATLAB到C++的波传播仿真,我遇到了以下问题:_C++ - Fatal编程技术网

函数初始化类内的动态数组 作为练习,我将我的硕士论文的时域有限差分法转换成了从MATLAB到C++的波传播仿真,我遇到了以下问题:

函数初始化类内的动态数组 作为练习,我将我的硕士论文的时域有限差分法转换成了从MATLAB到C++的波传播仿真,我遇到了以下问题:,c++,C++,我想创建一个类,它对应于称为cpml的非物理吸收层。层的大小取决于所需的模拟参数,因此定义吸收层的阵列必须是动态的 #ifndef fdtd_h #define fdtd_h #include <cmath> #include <iostream> #include <sstream> using namespace std; class cpml { public: int thickness; int n_1, n_2, n_3; double

我想创建一个类,它对应于称为cpml的非物理吸收层。层的大小取决于所需的模拟参数,因此定义吸收层的阵列必须是动态的

#ifndef fdtd_h
#define fdtd_h

#include <cmath>
#include <iostream>
#include <sstream>

using namespace std;

class cpml {

public:

int thickness;
int n_1, n_2, n_3;
double cut_off_freq;
double kappa_x_max, sigma_x_1_max, sigma_x_2_max, alpha_x_max;

double *kappa_x_tau_xy, *sigma_x_tau_xy, *alpha_x_tau_xy;

void set_cpml_parameters_tau_xy();

};

void cpml::set_cpml_parameters_tau_xy(){

double temp1[thickness], temp2[thickness], temp3[thickness];

for(int j = 1; j < thickness; j++){

    temp1[j] = 1 + kappa_x_max * pow((double)(thickness - j - 0.5) / (double)(thickness - 1), n_1);
    temp2[j] = sigma_x_1_max * pow((double)(thickness - j - 0.5) / (double)(thickness - 1), n_1 + n_2);
    temp3[j] = alpha_x_max * pow((double)(j - 0.5) / (double)(thickness - 1), n_3);


}

kappa_x_tau_xy = temp1;
sigma_x_tau_xy = temp2;

for(int i = 1; i < thickness; i++){

    cout << sigma_x_tau_xy[i] << endl;

}

alpha_x_tau_xy = temp3;

}

#endif /* fdtd_h */
#ifndef fdtd#h
#定义时域有限差分法
#包括
#包括
#包括
使用名称空间std;
类cpml{
公众:
int厚度;
int n_1、n_2、n_3;
双截止频率;
双kappa_x_max、sigma_x_1_max、sigma_x_2_max、alpha_x_max;
双*kappa_x_tau_xy,*sigma_x_tau xy,*alpha_x_tau xy;
void set_cpml_参数_tau_xy();
};
void cpml::set_cpml_参数_tau_xy(){
双temp1[厚度]、temp2[厚度]、temp3[厚度];
对于(int j=1;jCUT< P>两个问题:它们的一个小的方面是,您的程序在技术上不是一个有效的C++程序,因为C++没有(您的数组<代码> Tun1,<代码> Tun2和 TEMP3)。
更严重的问题是保存指向局部变量的指针。当函数返回时,局部变量超出范围而不再存在。指向它们的指针将变得无效,使用这些指针将导致未定义的行为


这两个问题都很容易用数组和指针来代替。

两个问题:它们的技术是,在程序上技术上不是一个有效的C++程序,因为C++没有(你的数组<代码> TEMP1 ,<代码> Tun2和 TEMP3)。 更严重的问题是保存指向局部变量的指针。当函数返回时,局部变量超出范围而不再存在。指向它们的指针将变得无效,使用这些指针将导致未定义的行为


这两个问题很容易用数组和指针代替。

不能声明C++中的数组,没有一个“常量”表达式的大小(必须在编译时知道)。这意味着该代码无效:

double temp1[thickness], temp2[thickness], temp3[thickness];
相反,您应该执行以下操作:

class cmpl
{
   //...
   std::vector<double> kappa_x_tau_xy, sigma_x_tau_xy, alpha_x_tau_xy;
   // ...
};

void cpml::set_cpml_parameters_tau_xy(){
   alpha_x_tau_xy.resize(thickness);
   kappa_x_tau_xy.resize(thickness);
   sigma_x_tau_xy.resize(thickness);
   //...
main
中也有类似问题:

for(int j = 1; j < cpml.thickness; j++){

    cout << *(cpml.sigma_x_tau_xy + j) << endl;

}
这可以说是更好的。(不过,您可以使用getter从类中获取
sigma\u tau\u xy
,然后自己打印)然后你可以考虑如何通过创建表示
alpha_x_max
alpha_y_max
等逻辑分组的对象来进一步简化事情。这可以是一个
std::pair
或一个带有自己的getter和setter的完全on结构。现在,它们自己的逻辑被分组在一起,并且很容易传递/ref参考/思考。
cmpl
的构造函数也变得更简单,您可以接受一个同时表示
x
y
的参数,而不是分别表示这两个参数


Matlab在我(公认的BLIF)经验中并不真正鼓励面向对象的方法,但是在C++中很容易。

< P>不能在C++中声明一个数组,而没有一个“常量”表达式的大小(必须在编译时知道)。这意味着该代码无效:

double temp1[thickness], temp2[thickness], temp3[thickness];
相反,您应该执行以下操作:

class cmpl
{
   //...
   std::vector<double> kappa_x_tau_xy, sigma_x_tau_xy, alpha_x_tau_xy;
   // ...
};

void cpml::set_cpml_parameters_tau_xy(){
   alpha_x_tau_xy.resize(thickness);
   kappa_x_tau_xy.resize(thickness);
   sigma_x_tau_xy.resize(thickness);
   //...
main
中也有类似问题:

for(int j = 1; j < cpml.thickness; j++){

    cout << *(cpml.sigma_x_tau_xy + j) << endl;

}
这可以说是更好的。(不过,您可以使用getter从类中获取
sigma\u tau\u xy
,然后自己打印)然后你可以考虑如何通过创建表示
alpha_x_max
alpha_y_max
等逻辑分组的对象来进一步简化事情。这可以是一个
std::pair
或一个带有自己的getter和setter的完全on结构。现在,它们自己的逻辑被分组在一起,并且很容易传递/ref参考/思考。
cmpl
的构造函数也变得更简单,您可以接受一个同时表示
x
y
的参数,而不是分别表示这两个参数


Matlab在我(公认的BLIF)经验中并不真正鼓励面向对象的方法,但是在C++中很容易。

如果需要动态数组,则确实需要使用<代码> STD::Vector < /C>。“最好”的C++方式是使用<代码> STD::Vector < /Cl> >(它是动态容器类),而不是原始数组(它从来不是动态的,但可以动态分配)。如果需要动态数组,则应该使用<代码> STD::vector < /代码>。<代码> >代码> SETHSPMCLIOVALDSELSYTAXYX结束,因此不能“存储”以后使用。“最好”的C++方式是使用<代码> STD::vector < /Cl> >(它是动态容器类),而不是原始数组(它从不动态),但可以动态分配。
int main() {
    int cpml_thickness = 10; 
    int n_1 = 3, n_2 = 0, n_3 = 3;  
    double cut_off_freq = 1;

    double kappa_x_max = 0;
    double sigma_x_1_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_x), sigma_x_2_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_x);
    double alpha_x_max = 2 * PI * cut_off_freq;

    double kappa_y_max = 0;
    double sigma_y_1_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_y), sigma_y_2_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_y);
    double alpha_y_max = 2 * PI * cut_off_freq;

    cpml cpml(cpml_thickness, n_1, n_2, n_3, cut_off_freq, kappa_x_max, kappa_y_max, sigma_x_1_max, sigma_x_2max, alpha_x_max, alpha_y_max);
    cpml.set_cpml_parameters_tau_xy();
    cpml.PrintSigmaTauXY(std::cout);
}