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

 
fxsaber #:

Благодарю Вас за время и усилия, что уделили моей задаче! Ваш вариант формально выполняет требуемое, при этом в некоторых ситуациях пользоваться им очень сложно: получить значение поля.

Можно попробовать добавить имя переменной, как строковой параметр. А доступ к значению через CHashMap.

Документация по MQL5: Стандартная библиотека / Шаблонные коллекции данных / CHashMap
Документация по MQL5: Стандартная библиотека / Шаблонные коллекции данных / CHashMap
  • www.mql5.com
CHashMap - Шаблонные коллекции данных - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
class A {};

void OnStart()
{
  A* a1 = A();
  A* a2 = &A();
}

Отсутствие ошибки в выделенной строке (указатель равен объекту) - правильно?

 
class A {};

template <typename T>
class B : public A
{
public:
  B( T ) {}
};

void OnStart()
{
  A* a1 = new B(0); // fatal compiler error: constructor of class 'B' not found
  A* a2 = new B<int>(0); // OK
}

Вроде, все однозначно, но компилятор ругается.

 
fxsaber #:

Вроде, все однозначно, но компилятор ругается.

Ваш код содержит несколько ошибок. Давайте разберем их по порядку:

  1. В первом блоке кода:

A* a1 = A(); A* a2 = &A();

Здесь вы пытаетесь присвоить временный объект типа  A  указателю  a1 . Это вызовет ошибку компиляции, потому что  A()  создает временный объект, который уничтожается сразу после этого выражения, и вы не можете безопасно присвоить его указателю. Вместо этого, вы должны использовать оператор  new  для создания объекта в динамической памяти:

    A* a1 = new A();

В случае с  a2 , вы пытаетесь получить адрес временного объекта, что также недопустимо.

  1. Во втором блоке кода:

A* a1 = new B(0); // fatal compiler error: constructor of class 'B' not found A* a2 = new B<int>(0); // OK

Здесь вы пытаетесь создать объект типа  B  с помощью шаблонного параметра, который не указан. Компилятор не может определить, какой тип использовать для  T  в  B(0) , поэтому возникает ошибка. Вместо этого, вы должны явно указать тип параметра, как вы делаете в следующей строке:

    A* a1 = new B<int>(0); // OK

Это исправит ошибку компиляции. Надеюсь, это помогло! Если у вас есть еще вопросы, не стесняйтесь задавать.

 
Yuriy Vasilyev #:

Ваш код содержит несколько ошибок.

Тест Тьюринга не пройден, к сожалению.
 
Коллеги, с дистрибутивом именно Ф*нама(не знаю можно ли здесь писать),

Проверьте пожалуйста корректность работы функции советника на каком-нибудь фьюче. Похоже критический баг для расчета маржи - всегда возвращает 0.

double margin;
Print( "Calc Margin is: ", OrderCalcMargin( ORDER_TYPE_BUY, Symbol(), 1.0, SymbolInfoDouble(_Symbol, SYMBOL_ASK), margin ));
Print( " Margin is: ", margin);
Если выдаёт значение отличное от нуля напишите что за билд?

Спасибо!
 
fxsaber #:
class A {}; template <typename T> class B : public A { public:   B( T ) {} }; void OnStart() {   A* a1 = new B(0); // fatal compiler error: constructor of class 'B' not found   A* a2 = new B<int>(0); // OK }
class A {};

template <typename T>
class B : public A
{
public:
  B( T ) {}
};

void OnStart()
{
  A* a1 = new B<int>(0); // OK now
  A* a2 = new B<int>(0); // OK
}
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Anatoli Kazharski, 2024.01.16 16:59

Можно попробовать добавить имя переменной, как строковой параметр. А доступ к значению через CHashMap.

Вот такой вариант:

#include <Arrays\ArrayObj.mqh>
#include <Generic\HashMap.mqh>
//+------------------------------------------------------------------+
//| Variable                                                         |
//+------------------------------------------------------------------+
class Variable : public CObject {
protected:
  string var_name;

public:
  Variable(string name) : var_name(name) {}
  virtual string ToString(void) const = 0;
  virtual string TypeName(void) const = 0;
  virtual string GetName(void) const { return var_name; }
};
//+------------------------------------------------------------------+
//| IntVariable                                                      |
//+------------------------------------------------------------------+
class IntVariable : public Variable {
  int value;

public:
  IntVariable(string name, int v) : Variable(name), value(v) {}
  virtual string ToString(void) const override { return(string(value)); }
  virtual string TypeName(void) const override { return("int"); }
};
//+------------------------------------------------------------------+
//| DoubleVariable                                                   |
//+------------------------------------------------------------------+
class DoubleVariable : public Variable {
  double value;

public:
  DoubleVariable(string name, double v) : Variable(name), value(v) {}
  virtual string ToString(void) const override { return(DoubleToString(value, 8)); }
  virtual string TypeName(void) const override { return("double"); }
};
//+------------------------------------------------------------------+
//| MyClass                                                          |
//+------------------------------------------------------------------+
class MyClass {
  
  CArrayObj vars;
  CHashMap<string, CObject*> map;
  
public:
  MyClass() {}
  
 ~MyClass() {
    for (int i = 0; i < vars.Total(); i++) {
      delete vars.At(i);
    }
    vars.Clear();
    map.Clear();
  }
  
  void Add(Variable *var) {
    vars.Add(var);
    map.TrySetValue(var.GetName(), var);
  }
  
  template<typename T>
  bool Get(string name, T &out_value) {
    
    CObject *obj;
    
    if(map.TryGetValue(name, obj)) {
      Variable *var = (Variable *)obj;
      out_value = (T)var.ToString();
      return true;
    }
    return false;
  }
};
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void) {
  
  MyClass my_class;
  
  my_class.Add(new IntVariable("spread", 10));
  my_class.Add(new DoubleVariable("price", 123.456));
  
  int spread_value;
  if(my_class.Get("spread", spread_value)) {
    Print("IntVariable 'spread': ", spread_value);
  }
  
  double price_value;
  if(my_class.Get("price", price_value)) {
    Print("DoubleVariable 'price': ", price_value);
  }
}
//+------------------------------------------------------------------+

//---

Результат:

IntVariable 'spread': 10
DoubleVariable 'price': 123.456
 
Yuriy Vasilyev #:

Вы сделали две идентичные записи, потеряв суть вопроса.

 
Anatoli Kazharski #:

Вот такой вариант:

Спасибо еще раз! Сделал такой вариант с примерами использования.

Input_Struct
Input_Struct
  • www.mql5.com
Структура входных параметров
Причина обращения: