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

 
Ilya Malev:

リストの基底クラスとしてCNode(Prev()、Next()などのメソッドを持つ)を用意し、その子孫であるCOrderのフィールドをループで呼び出しています。ループは、その子孫であるCOrderのフィールドを呼び出します。ループはdefinesで1回だけ宣言され、あとはいたるところで使われる。

あなたの例に従おうとしましたが、typedefを使いたいのです。

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }   
  };
  
typedef CMyclass (*PtrCMyclass)(CObject*); 
PtrCMyclass Myclass;
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      Myclass(base.GetCurrentNode()).x = 99;
      Myclass(base.GetCurrentNode()).y = -555.5;
     }
   for(int i=0;i<3;i++)
     {
      Print(Myclass(base.GetNodeAtIndex(i)).x," : ",Myclass(base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

今、コンパイラは私の例をスキップしますが、私は...何かが必要です...しかし、何? 実行時にエラーが発生します。

tst_file.mq4' 内の無効な関数 ポインタ呼び出し (30,7)


 
Igor Makanu:

あなたの言う通り、あなたの例を試してみましたが、私はtypedefを使いたいのです。

今、コンパイラは私の例をスキップしていますが、私は・・・何か必要です・・・でも何?

tst_file.mq4' 内の無効な関数 ポインタ呼び出し (30,7)


なので、関数を書いて、ポインタに代入する必要があります)))

typedef CMyclass* (*PtrCMyclass)(CObject*);
CMyclass* FMyCast1(CObject*p){ CMyclass *r = dynamic_cast<CMyclass*>(p); if(CheckPointer( r ) != POINTER_INVALID) return r; else return NULL; }
PtrCMyclass Myclass = FMyCast1;
 
Ilya Malev:

そのため、関数を書いてポインタに代入する必要があります)))

ふむ、なるほどと思いつつ、では、次のように関数を書くと、クラスフィールドに対応するポイントがないのです。

PtrCMyclass Myclass(CObject* obj){ return(GetPointer(obj)); }.PtrCMyclass Myclass(CObject* obj) { return(GetPointer(obj)); };

'x' - struct or class type expected tst_file.mq4 30 38


 
上に書いたように試してみてください。しかし,typedefはコードと関数呼び出しの 間に不必要な「詰め物」をすることになるので,ここでは本当に必要ない。同じポインターを使用する他のクラスでこの呼び出しをオーバーロードすることはまだできません。クラスごとに新しく作る必要があります。そろそろ型定義は全く役に立たないということを理解してもいい頃だと思うのですが、いかがでしょう :)
 
Igor Makanu:

((CMyclass*)base.GetNodeAtIndex(i)).x

 
Ilya Malev:
上に書いたように試してみてください。typedefはコードと関数呼び出しの 間の余分な「スペーサー」であるため、ここでは必要ないのだが。それでも、同じポインタを使った別のクラスで、この呼び出しをオーバーロードすることはできません。クラスごとに新しく作る必要があります。そろそろ型定義は全く役に立たないということを理解してもいい頃だと思うのですが、いかがでしょう :)

私はそれを試してみましたが、私はまだdefansで動作する方法がわからない、科学は複雑です、私はエラーが発生しました: tst_file EURUSD,H1: 'tst_file.mq4' で無効なポインタアクセス(31,56)。

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }
  };
//+------------------------------------------------------------------+
#define  alive(node)  (CheckPointer(node)==POINTER_DYNAMIC)
#define  loopf(type, node)  for(type *o; o=node;)
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   CMyclass *res;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      loopf(CMyclass,base.GetCurrentNode()){ o.x = 99; res.y = 555;}
     }

   for(int i=0;i<3;i++)
     {
      res=base.GetNodeAtIndex(i);
      Print(res.x," : ",res.y);
     }
   delete base;
  }
//+------------------------------------------------------------------+
 
TheXpert:

((CMyclass*)base.GetNodeAtIndex(i)).x

HOORAY!IT WORKED!!!

ありがとうございました。

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      ((CMyclass*)base.GetCurrentNode()).x = 99;
      ((CMyclass*)base.GetCurrentNode()).y = 555;
     }

   for(int i=0;i<3;i++)
     {
      Print(((CMyclass*)base.GetNodeAtIndex(i)).x," : ",((CMyclass*)base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

;)

 
Igor Makanu:

私はそれを試してみましたが、私はまだdefansで動作する方法がわからない、科学は複雑です、私はエラーが発生しました: tst_file EURUSD,H1: 'tst_file.mq4' で無効なポインタアクセス(31,56)。

もし私のループがあなたのライブラリノードで動くとしたら、とても驚きです)))

もちろん前回の投稿のtypedefのコードのことです)))

イゴール・マカヌ

HOORAY!IT WORKED!!!

ありがとうございます。

;)

本当に、なぜ一番わかりやすいものをすぐに試さなかったのでしょうか。:)そんなにtypedefとロックしたかったの?=)))

 
Ilya Malev:

本当に、なぜ一番わかりやすいものを最初に試さなかったんだ?:)そんなにtypedefでロックしたかったんですか?=)))

試してみました!MQLを使ってポインタを 参照解除するのは無理だろうと思っていましたが、些細なことであることがわかりました。))))

ZS: typedefはトピックですね。私も試してみたのですが、うまくいきませんでした。

 
Alexandr Sokolov:

M1チャートだけ動作しないことがあるが、他のチャートでは正常に動作しているのはなぜか?(MQL5)です。以下はその関数です。M1チャートで0を与えると、なぜか1つの変数の合計が出ません。


これは、Open = Close のローソク足が存在することを意味しますが、コードの書き方が間違っており、0による除算のチェックが入っていません。この残念な事実は、TFには関係ありません。