エラー、バグ、質問 - ページ 216

 
Vigor:

コールスタックオーバーフローの問題に遭遇した(と私は思う)。

オブジェクトの1つのメソッドを呼び出した後、以下の例を参照してください。コードは簡略化されており、要点のみです。クラス CClass1 は基底クラスであり、list1 にはこのクラスの子孫である異なるオブジェクトがあり、それらの init 関数は異なる実装になっています。そこで、init関数がこのようなリストを取ってくる(簡単に言うと、ネストしたインターフェース、パネルの中のパネルを初期化する)あるクラスでは、initから戻った後、行の中で

杞憂に終わる

2010.12.02 00:21:00 test1 (EURUSD,H1) 'Container.mqh' で無効なポインタアクセス (74,10)

つまり、ポインターtは死んでいる。

デバッグ時には、このようなエラーは発生せず、メソッド呼び出し後にポインタが「生きて」いて、ネストしたインターフェースが作成され、Expert Advisorがさらに動作します。

これがエラーを回避する唯一の方法です。

#property stacksize ポインタは何も達成しませんでした。

はっきりしたことは言えません。ソースコードが必要です。

servicedeskにリクエストを 書き込んでみてください。

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 

休日から帰ってきてターミナルを起動し、360ビルドにアップデートしたら、1つのインジケーターが動かなくなった...。

6.MQL5:チャート上のクリックイベントの処理を修正しました。

グラフィカル オブジェクトをクリックすると、CHARTEVENT_OBJECT_CLICK+ CHARTEVENT_CLICK という 2 つのイベントが同時に生成されます(以前は CHARTEVENT_OBJECT_CLICK が 1 つだけでしたが、現在はダブルクリックをシミュレートすることが可能です)。

ずっとこのままなのか、それともバグなのか?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 
AlexSTAL:

休暇から戻り、ターミナルを起動し、360ビルドにアップデートしたら、1つのインジケータが動かなくなった...。

を変化で読み取る。 6.MQL5:チャート上のクリックイベントの処理を修正しました。

グラフィカル オブジェクトをクリックすると、CHARTEVENT_OBJECT_CLICK+ CHARTEVENT_CLICK という 2 つのイベントが同時に生成されます(以前は CHARTEVENT_OBJECT_CLICK が 1 つだけでしたが、現在はダブルクリックをシミュレートすることが可能です)。

ずっとこのままなのか、それともバグなのか?

これは意図的にやったことです。
 

またしても、不可能の壁にぶち当たった。

コンストラクタにパラメータを渡して、特定のパラメータでクラスが初期化されるようにする必要があります。

この問題を回避するにはどうしたらよいでしょうか? オススメの方法を教えてください。

 
Urain:

またしても、不可能の壁にぶち当たった。

クラスを初期化するためのコンストラクタに、あるパラメータを渡す必要があるのですが。

この問題を回避するにはどうしたらいいのでしょうか?


к

さて、どうしたものか

class test{
  private:
    bool inited;
    int value;  
  public:
    void test(){
      inited = false;
    }
    
  bool Set( int passed ){
    value = passed;
    return(true);
  }
  bool Init( int passed ){
    if ( Set( passed ) ){
      inited = true;
      return(true);
    }
    return(false);
  }
  int Get( ){
    if( !inited ){
      Print("Объект неинициализирован");
      return(-1);
    }
    return(value);
  }
};

void OnStart()
  {
  
  
  test var;
  if( !var.Init(1)){
    Print("Ошибка инициализации объекта");
    return;
}
  Print(var.Get());
  
  test var2;
  Print( var2.Get() );
  }

そしてもちろん、継承されたクラスの場合は正しい順序でInitsを配置する必要があります。

複雑なプロジェクトでのエラー処理について記事を書いてほしい。Print and return as hereは解決策ではない。

 
gdtt:

まあ、それ以外に道はないでしょう。

そしてもちろん、継承されたクラスの場合は正しい順序でInitsを配置する必要があります

一般的には、複雑なプロジェクトにおけるエラー処理、Print、return as hereは解決策にならない、などの記事を書いてもらいたいものです。

つまり、コンストラクションを完成させるプリコンストラクタを作り、そのプリコンストラクタに初期化フラグを表示させることです。

一般的には、良い解決策ですが、不便な点もあります。各関数に初期化フラグをポーリングする必要があり、クラス関数の数が多くなると不便です。

もし、何かを変えなければならないとしたら、すべての機能を書き直さなければならない。

SZ コードを編集し、タイプミスを修正しました。

class test
  {
private:
   bool              inited;
   int               value;
public:
                     test(void){inited=false;};
   bool Set(int passed){value=passed;return(true);};
   bool Init(int passed)
     {
      if(Set(passed))inited=true;    
      return(inited);
     };
   int Get()
     {
      if(!inited)
        {
         Print("Объект неинициализирован");
         return(-1);
        }        
      return(value);
     };
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {

   test var;
   var.Init(1);
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }
 
Urain:

つまり、コンストラクションを完成させるプリコンストラクタを作成し、そのプリコンストラクタに初期化フラグを設定するのです。

総じて、かっこいいのですが、不便な点もあります。初期化フラグを各関数に問い合わせる必要があり、クラス関数の数が多い場合は不便です。

のコードも2回目と同じように更新されています。

SZ コードを編集し、見落としを修正しました。

まあ、コンストラクタがあったとしても、初期化が成功したとは言えないでしょう。

もちろん、一度確認することも可能です。

void OnStart()
  {

   test var;
   if( ! var.Init(1)){
     // здесь какято обрабтка
     return;
   };
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }

しかし、自分のコードを使うなら、呼び出し時に初期化の事実を確認することをルール化すればいいし、他の人が使うなら、「この構造しか使ってはいけない、そうでなければ結果は保証できない」なんて指示は書けません。いいえ、いずれにせよクラスメソ ッドで初期化されているかどうかをチェックする必要があります。

削除済み  

開発者の皆様へ。

新ビルドの再起動直後


追記

別フォルダにインストールしたターミナルのアップデートは成功し、シンボルはリストに表示されています(ただし、アップデート前には開いているチャートは ありませんでした)...。

 

バグなのか、ダメなのか、教えてください。

ENUM_ORDER_TYPE Signal[21];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArrayInitialize(Signal,WRONG_VALUE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

エラーが表示される

'ArrayInitialize' - no one of the overloads can be applied to the function call 
削除済み  
sergey1294:

これはバグなのか、許されないのか、教えてください。

エラーが表示されます


おそらく、ArrayInitialize()は、特定の型、正確には数値(intまたはdouble)の配列のみを埋めることを意図しているのでしょう。

配列の型がENUM_ORDER_TYPE で あるため、ArrayInitialize を呼び出すと、このメソッドの呼び出しは許可されないというエラーが発生します。

この場合、選択肢は2つあると私は考えています。

1.ENUM_ORDER_TYPEの 配列型をint型に 変更し、同時にコードでそれを考慮する(少なくとも順序型はint型として容易に表現できる)。

2.配列の「初期化」を独立に実装する。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5