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

 
Ilya Malev:

У меня там нет функций, а решается именно та задача, которую Вы описали. базовый класс списка у меня CNode ( в котором методы Prev(), Next() и т.п. ), а в цикле идет обращение к полям COrder, который является его наследником. Цикл объявляется в дефайнах 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;
  }
//+------------------------------------------------------------------+

теперь компилятор пропускает мой пример, но где то нужно... что то нужно... а что? ошибку получаю при выполнении:

nvalid function pointer call in 'tst_file.mq4' (30,7)


 
Igor Makanu:

видимо Вы правы, попытался сделать по Вашему примеру, но хочу все таки через typedef

теперь компилятор пропускает мой пример, но где то нужно... что то нужно... а что? ошибку получаю при выполнении:

nvalid function pointer call in '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)); };

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


 
Попробуйте как я выше написал. Хотя typedef тут не сильно нужен, ибо является лишней "прокладкой" между кодом и вызовом функции. Вы все равно не сможете перегрузить этот вызов для другого класса,используя тот же самый указатель. Придется делать новый для каждого класса. Пора Вам уже понять, что typedef чуть менее чем полностью бесполезны, имхо :)
 
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. От ТФ это печальное обстоятельство никак не зависит.

Причина обращения: