Ошибки, баги, вопросы - страница 2362

 
Igor Makanu:

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

 
Ilya Malev:
Попробуйте как я выше написал. Хотя typedef тут не сильно нужен, ибо является лишней "прокладкой" между кодом и вызовом функции. Вы все равно не сможете перегрузить этот вызов для другого класса,используя тот же самый указатель. Придется делать новый для каждого класса. Пора Вам уже понять, что typedef чуть менее чем полностью бесполезны, имхо :)

попробовал, но все равно не умею с дефанами работать, наука сложная , ошибку получил:  tst_file EURUSD,H1: invalid pointer access in '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

УРА! ЗАРАБОТАЛО!!!

Спасибо!

#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:

попробовал, но все равно не умею с дефанами работать, наука сложная , ошибку получил:  tst_file EURUSD,H1: invalid pointer access in 'tst_file.mq4' (31,56)

Я бы сильно удивился, если бы мой цикл заработал с Вашим библиотечным нодом))) 

Я имел в виду код с typedef в своем прошлом посте, конечно)))

Igor Makanu:

УРА! ЗАРАБОТАЛО!!!

Спасибо!

;)

Неужели, а чего же Вы сразу самое очевидное не попробовали? :) Так хотелось позажигать с typedef? =)))

 
Ilya Malev:

Неужели, а чего же Вы сразу самое очевидное не попробовали? :) Так хотелось позажигать с typedef? =)))

я попробовал! но была уверенность, что не получится указатель разыменовать средствами MQL, оказалась все банально - нужно было больше скобок ставить! ))))

ЗЫ:  typedef это тема, пробовал, но тож не очень пошло, нужно еще разбираться где накосячил, должно и с помощью typedef мой пример работать!

 
Alexandr Sokolov:

По каким причинам индикатор может не работать только на M1 графике а на всех остальных работать без сбоев? (MQL5). Вот функция - и когда на графике М1 ей дать 0, то оду переменную она почемуто не сумирует


Это значит там есть свеча, у которой Open = Close, а сам код написан криво и не содержит проверки на деление на 0. От ТФ это печальное обстоятельство никак не зависит.

 
Igor Makanu:

 typedef это тема, пробовал, но тож не очень пошло, нужно еще разбираться где накосячил, должно и с помощью typedef мой пример работать!

Код, который я написал выше, должен работать. Хотел было у себя проверить, но не судьба: =)))))))))))


(билд 1961)

 
Igor Makanu:

typedef это тема, пробовал, но тож не очень пошло, нужно еще разбираться где накосячил, должно и с помощью typedef мой пример работать!

А можете сделать проще и изящее - без лишних скобок и указателей - (и компилируется без странных ошибок))))

#property strict

class CObject{ };
class CMyclass: public CObject {
  public: CMyclass *operator[] (CObject*p){ CMyclass*r = dynamic_cast<CMyclass*>(p); 
                                return CheckPointer(r)!=POINTER_INVALID?r:NULL; }
          int f(){ return 1; } 
} my ;

void OnStart()
{
  CObject*co=new CMyclass;
  
  my[co].f();
}
 
Ilya Malev:

А можете сделать проще и изящее - без лишних скобок и указателей - (и компилируется без странных ошибок))))

не прокатит для моего случая Ваш пример, у меня обьекты динамически создаются, я даже имя им не присваиваю, а Ваш пример через обращение к имени указателя, вот так пробовал, не пропускает компилятор:  '[' - name expected tst_cast.mq4 32 15


#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   CObject           *obj;
   void              CMyclass(void):x(-1),y(-2.2)  {                       }
   public: CMyclass *operator[] (CObject*p){ CMyclass*r = dynamic_cast<CMyclass*>(p); 
                                             return CheckPointer(r)!=POINTER_INVALID?r:NULL; }         
  };
//+------------------------------------------------------------------+
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;
      CMyclass[base.GetCurrentNode()].x = 111;
     }

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

ЗЫ: немного начал понимать, что Вы предлагаете, но все равно результата нет, можно и без dynamic_cast <> обойтись, добавить поле * CObject , в теории вот так должно быть:

...
 CObject           *obj;
 CMyclass          *operator[](CObject*p)        { obj = p; return(obj); }          
  };

думаю так будет чуть быстрее работать, чем Ваш пример с dynamic_cast <> - смысл вроде один и тот же

 
Igor Makanu:

если возможность в MQL разыменовывать указатель *CObject ?

пробовал разные варианты, вот скрипт для теста, добавляю в связанный список 3 элемента Myclass и потом изменяю значения полей CMyclass, так все работает:

могу ли я изменять поля динамически созданных элементов CMyclass, без промежуточного указателя  CMyclass *result ?

примерно так: (CMyclass *)(base.GetCurrentNode()).x = 99;

PS: подозреваю, что нужно использовать typedef , но пока неудачно

То, что Вы написали просто неявное использование того же:

result=base.GetCurrentNode();

Т.е. такой анонимный указатель, а по сути просто синтаксический сахар. Сахара в MQL почти нет, поэтому так не получиться сделать. Но замечу приведение типа к потомку идет без всяких там проверок и преобразований потому очень быстро, из-за этого не совсем понятно, чем Вам так не угодила явная работа с указателем.