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

 
Andrey Dik:

а как можно посмотреть кодировку?
то, что она изменилась я узнал по изменению вида текста в стороннем редактое, а как узать какая кодировка не знаю.
Andrey Khatimlianskii:
Только что создал советника в МЕ 1580: Win-1251 (ANSI)

Да, Акепадом вижу, что кодировка Win-1251 (ANSI), а у более старых файлов UTF-16LE 1200.

Так значит всё таки изменилась кодировка по умолчанию для новых файлов?

 

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.04.14 11:40

Ага, криворукие брокеры. Они бы еще туда отрицательные числа запихали.

Хорошо бы, чтобы у разработчиков было ограничение диапазона возможных значений каждого параметра, когда брокеры настраивают символы.

 

Заметил, что при обновлении продуктов из маркета - все настройки этого продукта на графиках сбрасываются на настройки по умолчанию. 

Это же неправильно. как этого избежать? 

 

ArrayMaximum() и ArrayMinimum() - порядок передаваемых параметров не соответствует справке:


 
fxsaber:
Небольшой лайфхак. Обход оператора присваивания

Результат

Это не лайфхак, а извращение.

От Вас такого не ожидал.

 
Koldun Zloy:

Это не лайфхак, а извращение.

От Вас такого не ожидал.

Тогда это для Вас

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

Библиотеки: TypeToBytes

fxsaber, 2017.04.13 13:34

Пример того, как данная возможность может быть полезна для выявления потенциальных ошибок.

Пишем и запускаем скрипт.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}
};

#define PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


Результат.

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

Это говорит о том, что оператор присваивания не будет копировать структуру в структуру этого же типа.


Если в структуру добавить еще,

  void operator =( STRUCT &Value ) { this.i = 0; }

то результат будет тот же.


Казалось бы, исправив этот оператор на

  void operator =( STRUCT &Value ) { this.i = Value.i; }

должно все стать корректным, но библиотека говорит об обратном.


Пожалуй, здесь самый тонкий момент данного примера.

Исправляем на

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}

  void operator =( const STRUCT &Value ) { this.i = Value.i; }
};

#define PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

и получаем результат

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


Вот теперь оператор копирования написан корректно!

Подобным образом можно проверять корректность операторов присваивания/копирования любых простых структур.

 

1. Когда мы пишем так:

STRUCT StructCopy1 = Struct;
должен вызываться не operator=, а конструктор копирования.

Хотя, это больше вопрос к Метаквотам.

2. Если уж, не вызывается конструктор копирования, созданный компилятором, то мы можем его сами написать.

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

Теперь operator= не вызывается.

3. Поскольку члены структуры нам доступны, мы просто можем написать так:

StructCopy1.i = Struct.i;

Если же Вы сделаете их приватными, то и Ваш лайфхак не поможет.

4. И самое главное: operator= делают для того, чтобы всё присваивание шло через него, а не в обход.

Обычно вместе с ним определяют и конструктор копирования.

Да. Пример помотрел. Не увидел большой пользы.

 
Koldun Zloy:

1. Когда мы пишем так:

должен вызываться не operator=, а конструктор копирования.

Хотя, это больше вопрос к Метаквотам.

2. Если уж, не вызывается конструктор копирования, созданный компилятором, то мы можем его сами написать.

Теперь operator= не вызывается.

3. Поскольку члены структуры нам доступны, мы просто можем написать так:

Если же Вы сделаете их приватными, то и Ваш лайфхак не поможет.

4. И самое главное: operator= делают для того, чтобы всё присваивание шло через него, а не в обход.

Обычно вместе с ним определяют и конструктор копирования.

Да. Пример помотрел. Не увидел большой пользы.

Лайфхак обходит и конструктор копирования. А польза здесь
#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2;
  }
  
  void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Struct(1);  

  ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;  // STRUCT( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

_R - универсальная штука. Поэтому чужие структуры со своими операторами переопределять не требуется.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Structs[] = {{1}, {2}};
  
  ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik:

Да, Акепадом вижу, что кодировка Win-1251 (ANSI), а у более старых файлов UTF-16LE 1200.

Так значит всё таки изменилась кодировка по умолчанию для новых файлов?

Нет, всегда была Win-1251 (ANSI), а в какой-то момент добавилась UTF. Но только для тех исходников, которые содержат не-анси символы.
 
Andrey Khatimlianskii:
Нет, всегда была Win-1251 (ANSI), а в какой-то момент добавилась UTF. Но только для тех исходников, которые содержат не-анси символы.
Понятно. Спасибо.
Причина обращения: