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

[Удален]  
Блин, на пустом месте проблема придумывается. "Мыши плакали, кололись, но продолжали грызть кактус".
 
fxsaber:

поэкспериментировал, в общем тут как не крути, любое решение будет "ущербным"

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

я б вообще отказался от статических методов в структуре - в них просто смысла нет, код все равно будет запутанным и не логичным

выглядит примерно так:

int tmp[] = {1,2,3,99};
struct A
{
private:
   static int count;
public:
   const int a;
   A():a(tmp[count++]) {}
};
static int A::count = 0;
//+------------------------------------------------------------------+
void OnStart()
{
   A a[ArraySize(tmp)];
   for(int i=0;i<ArraySize(a);i++) Print(a[i].a);
}


 ....да и счетчик  count тож не нужен, нужно, по сути, обернуть A a[ArraySize(tmp)]; в макроподстановку которая  создаст массив структур и удалит временный массив tmp

 

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

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

 

Обобщу:

struct A {
    const int a; 
    A() {}
};
void OnStart()
{
            A a1; //(1) нормально
    const int a2; //(2) Error: 'a2' - 'const' variable must be initialized
}

А какая разница между 1 и 2 ?

 
A100:

Обобщу:

А какая разница между 1 и 2 ?

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

struct A {
    const int a[10]; 
    A() {ArrayPrint(a);} //-396985669       32758 -1490812928       32757  2147360768           0 -1681390008         493           0           0

};
//+------------------------------------------------------------------+
void OnStart()
{
  A a1;
}
//+------------------------------------------------------------------+

ЗЫ:  тут компилятор видит

void f()
{
   const int x;  //'x' - 'const' variable must be initialized
}
 
Igor Makanu:

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

ЗЫ:  тут компилятор видит

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

 
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 взад-вперед - не помогает.

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

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

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