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

 
Ilyas:

Я примерно понял причину. У меня есть глобальная переменная

CArrayObj actobjects;

Что-то с порядком инициализации мкл окружения и миссива видимо, если actobjects указатель и сам размещаю там массив, то ничего не падает. Класс в глобальных переменных - неправильная практика, конечно, перепишу. Но проблемы вылезут и со static массивами в функциях (в мкл ведь не действует правило - инициализация при первом входе в функцию).

В общем, если это считается за ошибку, то зная примерно причину, смогу локализовать, наверное.

 
pavlick_:

В общем, если это считается за ошибку, то зная примерно причину, смогу локализовать, наверное.

Не, не могу поймать, исчезает чудесным образом после вырезки кода. Влияет даже закомментированность некоторых строк (которые не исполняются до падения).

 

Есть длинный по коду класс, который лежит в mqh. Нужно создать ровно такой же класс, который отличается от исходного только в двух строках (вместо знака меньше должен быть знак больше).

Можно это сделать без создания еще одного почти идентичного mqh?


Когда класс короткий, его легко можно сделать многострочным макросом и все выходит просто. Но здесь код длинный.

Создавать mqh-клон не хочется, т.к. если поправлю один mqh, то надо будет все свои действия повторять во втором. И возникает человеческий фактор забывчивости и невнимательности.


Через шаблонный класс еще можно. Но совершенно не очевидно, как это скажется на скорости выполнения. Класс нужен для быстрых прогонов.

 
fxsaber:
#ifdef
 
TheXpert:
#ifdef

Не выйдет. Оба класса должны быть в работе.

 
fxsaber:

Не выйдет. Оба класса должны быть в работе.

не вижу проблем.

_____________

наследование

вынесение разностей в отдельные мелкие классы

 
TheXpert:

не вижу проблем.

_____________

наследование

вынесение разностей в отдельные мелкие классы

В классе несколько приличных по размеру методов. В каждом методе нужно только знак ">" заменить на знак "<".

Можно использовать virtual на подобие такого
class A
{
private:
  virtual bool Compare()
  {
    return(true);
  }
public:

  bool f()
  {
    return(this.Compare());
  }
};

class B : public A
{
private:
  virtual bool Compare()
  {
    return(false);
  }
};


void OnStart()
{
  A a;
  B b;
  
  Print(a.f());
  Print(b.f());
}


Но, к сожалению, нужно еще передать инициализирующее значение класса. Видимо, все же через шаблон придется делать.

 
fxsaber:

Я бы какие-нибудь адаптеры передавал через шаблонные параметры (не должно там быть каких-то тормозов), но если хочется так топорно, то тоже можно. Сделайте жёсткую ссылку на заголовочный файл (mklink /H <link> <target>, если не ошибаюсь. Можно погуглить на тему: "windows create hard link"). Ну и включаем это хозяйство обычным способом

#define _N C1    // имя класса
#define _M "c1"  // какой-то параметр
#include <qq.mqh>
#undef _N
#undef _M
#define _N C2
#define _M "c2"
#include <ee.mqh> // жёсткая ссылка на qq.mqh
#undef _N
#undef _M
 
pavlick_:

Я бы какие-нибудь адаптеры передавал через шаблонные параметры (не должно там быть каких-то тормозов), но если хочется так топорно, то тоже можно. Сделайте жёсткую ссылку на заголовочный файл (mklink /H <link> <target>, если не ошибаюсь. Можно погуглить на тему: "windows create hard link"). Ну и включаем это хозяйство обычным способом

Вы не поняли вопроса.

 
fxsaber:

Вы не поняли вопроса.

Ну х.з., а вы уверены что меня поняли? на всякий случай листинг qq.mqh и ee.mqh (одно сущность, меняя один меняется и другой)

class _N
{
public:
   void f() {Alert(_M);}
};

Всё как заказывали, класс не вмакросе, почти одинковы кроме _M.

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