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

 
A100:

Такого случая в принципе быть не должно - вопрос должен был быть решен еще на уровне компилятора (как в C++). А тут получается вроде как можно и как следствие обсуждение на несколько страниц

однозначно баг... но это наверное! )))

имхо, константные выражения должны быть известны на момент компиляции, статические - при инициализации приложения в очередности описания

а вот эта схема в MQL, где вроде как и есть контроль за константами, но константы я могу в рантайм сам назначить, причем можно использовать в качестве инициализации вызов функции, примерно так:

struct A
{
   const double a;
   A():a(AccountInfoDouble(ACCOUNT_BALANCE))
   {
      Print("a = ", a); // a = 9999.290000000001
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a1;
}
//+------------------------------------------------------------------+

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

 
Igor Makanu:
а вот эта схема в MQL, где вроде как и есть контроль за константами, но константы я могу в рантайм сам назначит

Сколько можно позориться элементарными незнаними основ С++?

 

такой пример, вообще с толку сбивает:

struct A
{
   const double a;
   A():a(SymbolInfoDouble(_Symbol,SYMBOL_ASK))
   {
      Print("a = ", a);
   }
};
void OnTick()
  {
   const A a;
  }
//+------------------------------------------------------------------+

2020.04.23 21:40:04.474 tst (EURUSD,H1) a = 1.07892

2020.04.23 21:40:04.546 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:04.585 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.254 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.305 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.306 tst (EURUSD,H1) a = 1.07892

 
Stanislav Korotky :

Есть две программы, работающие одновременно с одним и тем же файлом. Та, что записывает, использует флаги  FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ . Та, что читает - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Несмотря на то, что первая программа периодически сохраняет файл с помощью FileFlush, вторая видит длину файла только на момент открытия. Пробовал делать FileSeek взад-вперед - не помогает.

Вопрос: как сделать, чтобы программа, читающая файл, подхватывала дозаписываемые данные?

Это кажется ошибкой, об этом сообщалось некоторое время назад на английском форуме. У меня не было времени, чтобы сообщить об этом здесь.

Разве разработчики не читают английский форум?

 
Stanislav Korotky:

Есть две программы, работающие одновременно с одним и тем же файлом. Та, что записывает, использует флаги FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Та, что читает - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Несмотря на то, что первая программа периодически сохраняет файл с помощью FileFlush, вторая видит длину файла только на момент открытия. Пробовал делать FileSeek взад-вперед - не помогает.

Вопрос: как сделать, чтобы программа, читающая файл, подхватывала дозаписываемые данные?

Эти две программы в одном терминале или в двух разных?

 

Методы объекта из массива объектов, переданного по ссылке не отрабатывают.

Пример:

//+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split(const string separator,      // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if(StringLen(separator)==0) return(0);

   ushort u_sep=StringGetCharacter(separator,0); 
   
   int count=StringSplit(m_string,u_sep,tmp_result);

   // временно для проверки
   result[0].Assign("Buy"); // НЕ РАБОТАЕТ !!!!!!
   Alert("ressult[0] = ",result[0].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return(count);
  }
//+------------------------------------------------------------------+
 
Slava:

Эти две программы в одном терминале или в двух разных?

В одном терминале. Пишет данные эксперт, читает индикатор. Висели на разных чартах, но очевидно, что могут быть и на одном (если это важно). Билд 2380.

 

VS2019

#include <iostream>

int x;

struct A 
{
    const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = ";
    std::cin >> x;
    const A a;
    std::cout << "a.a = " << a.a;
}

x = 12345

a.a = 12345

хм, все работает как в MQL5

ОК, забираю свои слова обратно, в Шарпе это не скомпилируется

 
Vict:

Ну вам же ещё и конструктор всунули. Сами решайте, конечно, но структуры - сишные сущности, модель там другая - пассивные сущности с внешней логикой (фцнкции).

Совсем необязательно. Почему именно сишные?  Как насчёт C# ? - к нему как-раз таки ближе по смыслу.  Все разговоры о пассивности структур - это всё архаические представления, имхо.  Считаю, что, как минимум, конструктор обязан быть у каждого типа. Неинициализированные поля - это зло, от которого нужно уходить.  

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

struct A
{
  const int a;
  A(int init_value) : a(init_value) { }

  static bool CreateArray(A &array[], int count, int init_value)
  {
    //...
  }
};

И там уже одним из предложенных ранее способов заполнять элементы массива.

 

столкнулся со следующей незадачей. Индикатор рисует свечи

Он накинут на график. Также работает советник, читающий буфера этого индикатора

Так вот залогировав и заскринив этапы, обнаружил что частенько индикатор отрисовывает свечи с запаздыванием.

Т.е. уже несколько тиков назад (до пары минут точно) он просчитал и обновил буфера, и советник данные из них читает

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


а вот какая фактически картинка, она дорисовалась позже. Видим пробитие лоу, оно и инициировало запись скриншота. По логам все чётко.



Кто подскажет в чём дело и как ускорить обновление графика? Функцию ChartRedraw вызываю из советника, но всё равно пару минут задержка возникает.

Две минуты как-то многовато, даже не представлю причины. Расчёты не настолько космические чтобы так тормозить.

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