巴解组织。应用问题 - 页 14

 
Yedelkin:

"无效的指针访问" =="试图访问一个无效的指针"?如果是,那么

在下列情况下,一个指针可能是无效的

  • 指针NULL
  • 如果该对象被使用删除 操作符删除。

第一个案例是我的。

我很乐意使用 CheckPointer()和其他检查方法(我生不逢时),但从图表上拆解EA并不给我机会。

让我搞清楚--如果我在构造函数中指定指针等于 NULL,并停止对它的任何操作,Expert Advisor将得到281并退出(而根据我的想法,它不应该)。

但如果你在构造函数后调用Init或InitXXX (类似于CExpert ,一切都能正常工作。

 
Interesting:

第一个选项是我的情况。

我很乐意使用CheckPointer() 和其他检查方法(我在同一天出生),但从图表中崩溃的EA没有给我机会去做

让我搞清楚--如果我在构造函数中指定指针等于 NULL,并且用它打破所有可能的动作,EA将得到281并退出(根据我的想法,它不应该)。

但如果你在构造函数后调用Init或InitXXX (类似于CExpert) ,一切都能正常工作。


如果你处理了异常情况,你可以很容易地找出问题所在并加以解决。
 
Interesting:

第一个选项是我的情况。

我很乐意使用 CheckPointer()和其他检查方法(我想我不是昨天才出生的),但从图表上拆掉EA并没有给我机会去做。

让我搞清楚--如果我在构造函数中指定指针等于 NULL,并停止对它的任何操作,Expert Advisor将得到281并退出(而根据我的想法,它不应该)。

如果你在构造函数后调用Init或InitXXX (类似于CExpert) ,一切都能正常工作。

我还没有处理过Init或InitXXX方法,但我对 "EA崩溃 "本身的解释是:程序在运行时 撞上了不正确的指针,这个瓶颈必须在代码中寻找出来。我的构造函数也将一个指针初始化为NULL,但没有任何东西飞出来。

如果我对这个问题的理解有误,对不起。

 
Interesting:

谢谢你,现在一切都在其位置上。但是,还有一个问题--假设发生错误281,但希望EA不被卸载。我们应该如何处理?

让我澄清一下我的问题:如果在初始化的所有步骤后发生错误281,但它不会严重影响专家顾问的主要工作,根本不会运行它,该怎么办?

将不会有任何异常处理。

只有一个办法--不要使用不正确的指针。

如果一个指针有可能(除零以外)是不正确的,在使用前一定要检查。

 
uncleVic:

将不会有任何异常处理。

唯一的出路是不要使用无效的指针。

如果一个指针有可能(除零以外)是不正确的,在使用前一定要进行测试。


总是有一种可能性(不是零),即一个指针可能是无效的。

因此,你必须在每次使用前都检查其有效性。不仅仅是在创造之后。

并非总是如此,但我在关键时刻就是这样做的 :(


哦,该死,使用你的建议时,纯透明的代码变成了:)。

 
Yedelkin:

我还没有处理过Init或InitXXX方法,但我对 "把EA从图表中拿出来 "本身的解释是:程序在执行 过程中撞到了一个不正确的指针,需要寻找的正是代码中的这个瓶颈。我的构造函数也将一个指针初始化为NULL,但没有任何东西飞出来。

如果我误解了这个问题,我很抱歉。

如果你说的是CExpert类,你必须至少调用Init(...)。那里的所有指针都被初始化为指向基类对象的指针...。
 
falkov:

指针无效的可能性(不是零)是绝对的,总是可能的。

因此,在每次使用之前,你都应该检查其有效性。

并非总是如此,但在关键领域我是这样做的:()


我靠,使用你的建议时,纯透明的代码变成了什么样子:)。

替代方案:拥有干净透明的代码,在无效指针 上飞走?
 
uncleVic:
替代方案:有一个干净、透明的代码,在无效指针上失败?

替代方案:拥有干净、透明的代码。

在无效指针和其他特殊情况下(断电、磁盘空间等例外情况),程序会进入异常处理块,在那里,受人尊敬的Interesting(也包括我:)可以打印变量值 和错误,分析情况并了解问题所在。而且,如果对这个区块发生的事情没有反应,就退出。

当然,这并不意味着标准和必要的检查无效。这只适用于特殊情况。

 
uncleVic:
如果是CExpert类,你必须至少调用Init(...)。那里的所有指针都被初始化为指向基类对象的指针...。

例如,如果Init或InitXXX在执行时出现错误(返回false),然后呢?

或者,如果在执行过程中,EA仍然收到281(尽管所有的检查和技巧),但周围没有交易员,该怎么办?

不是一个好 主意。

如果你处理过例外情况,你可以很容易地找出问题所在,并处理这种情况。

几乎每一步都有检查,但不幸的是,处理过程不在那里......

PS

那么,关于EA退出图表的问题--如何做才能使EA在任何初始化中 "活着"?

 
uncleVic:
替代方案:为了获得干净透明的代码,通过无效指针崩溃?

好吧,这就是它飞出来的重点,让 "我 "自己来决定在这种情况下,专家是否应该被拉下来。

毕竟,我们甚至不是在谈论 "破损 "的指针被应用到某个地方,尽管我个人在应用它之前有一个检查(尽管我可以在定时器中实现另一个检查)。

我已经在某种程度上学会了与指标和谐相处,我不太关心初始化的结果,但我无法与指针交朋友。

耶德尔金

我还没有处理过Init或InitXXX方法,但我对 "EA dumping "的解释是:程序在运行时 撞上了一个不正确的指针,必须在代码中寻找这个瓶颈。我的构造函数也将一个指针初始化为NULL,但没有任何东西飞出来。

如果我误解了问题,我表示歉意。

目前,为了解决这个问题,我在初始化块中返回0。

int OnInit()
{
//----------------------------------------------------------------------------//

//Processing process of the initialization

//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

根据我的理解,这是对我来说最好的办法(所以EA不会在初始化时崩溃)。也就是说,在任何情况下,结果OnInit = 0,我都无法判断它的正确性。