本主题的延续,但有一个不同的问题
程序有一个主要的二维动态数组,这里创建
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
//---Поля для других методов;
int Nx, Nt;//На сколько частей разбиваетсся отрезок сетки
Nx = Convert::ToInt32(textBox5->Text);
Nt = Convert::ToInt32(textBox6->Text);
//Создание динамического двумерного массива для сеточных преобразований
double **wht = new double *[Nt];
for (int i = 0; i < Nt; i++)
wht[i] = new double[Nx];
//вызовы методов,которые вычисляют и записывают значения в wht
}
在外部button1_Click,也有将此数组作为参数的方法,但一切正常,因为所有这些方法和函数都在中再次调用button1_Click
但它timer1_Click不接受输入参数。值得编写额外的参数,编译器立即指向这一行并出现以下错误
this->timer1->Tick += gcnew System::EventHandler(this, &TransEquForm::timer1_Tick);
error C3352: void TransEqu::TransEquForm::timer1_Tick(System::Object ^,System::EventArgs ^,double **): указанная функция не соответствует типу делегата "void (System::Object ^,System::EventArgs ^)"
已采取以下行动
1)让它成为一个全局变量,一个表单字段,比如简单的变量(不是数组)还是可以全局创建的,但是对于数组还是第一次遇到这个。
我熟悉了全局动态数组的这个问题,并决定将其应用到我的项目中。
结果是当下面的代码运行时
double** wht;
double** created(int Nt,int Nx)
{
double **wht = new double *[Nt];
for (int i = 0; i < Nt; i++)
wht[i] = new double[Nx];
return wht;
}
使用数组wht时,出现以下异常
Необработанное исключение типа "System.NullReferenceException" в TransEqu.exe
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
但这些问题非常适合使用控制台以及在WinForms遇到上述困难时使用
2)头文件,类 有尝试实现这个选项,但是数组又出现了问题,事实是表单组件不愿意交互,尤其是需要在头文件中获取一些值的时候。
更新程序
让我提出问题如何将动态数组(创建于button1_Click)转移到事件timer1_Tick?
在您的“全局”数组示例中,有一个小错误会把事情搞砸。
在函数内部,您再次声明了 double **wht 变量,并通过这样做转义了具有相同名称的外部(全局)变量。此外,您还会发生内存泄漏。这是你的例外的来源,因为 您有一个未初始化的全局指针,并且您正在尝试使用它。在created()函数内部更改为:
一切都应该有效。
事件处理程序签名
Timer.Tick无法更改。使它
wht成为一个表单域。并在任何地方使用这个字段。你写:
在这种情况下,
Nx不是Nt字段,而是局部变量!不要混淆它们!字段在类级别(在您的情况下为表单)声明,并且在此类的所有方法(函数)中都可用。
局部变量在方法级别声明,并且仅在该方法内可用。