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

[Удален]  
Alexey Navoykov:

Совсем необязательно. Почему именно сишные?  Как насчёт C# ? - к нему как-раз таки ближе по смыслу.  

Наверное потому, что мкл с++ подобный, а туда структуры из си пришли.

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

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

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

Никакого зла там нет, вам кажется. Вон в стандарт протянули даже: чтение неинициализированного unsigned char и std::byte не undefinded behavior. Можно агрегатную инициализацию для POD. И не забывайте - вся эта инициализация не бесплатна, эта реальные расходы ресурсов (цпу, память, размер экзешника). Если вам класть на это со своей числодробилкой, то в случае какого-нибудь микроконтроллера это может быть важно. Ведь С/С++ это не только виндовое формошлёпство вроде шарпа.

unsigned char fn() {unsigned char q; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn>:
    1119:       55                      push   %rbp
    111a:       48 89 e5                mov    %rsp,%rbp
    111d:       0f b6 45 ff             movzbl -0x1(%rbp),%eax
    1121:       83 c0 02                add    $0x2,%eax
    1124:       5d                      pop    %rbp
    1125:       c3                      retq           

unsigned char fn2() {unsigned char q = 5; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn2>:
    1119:       55                      push   %rbp
    111a:       48 89 e5                mov    %rsp,%rbp
    111d:       c6 45 ff 05             movb   $0x5,-0x1(%rbp)
    1121:       0f b6 45 ff             movzbl -0x1(%rbp),%eax
    1125:       83 c0 02                add    $0x2,%eax
    1128:       5d                      pop    %rbp
    1129:       c3                      retq
Одна лишь инициализация одной переменной увеличила размер инструкций на 30%.
 
Stanislav Korotky:

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

Эксперт, который читает файл, должен держать этот файл закрытым.

Особенность реализации файлов в MQL5 такова, что они по максимуму держат данные из файлов в собственных буферах. Если объём информации настолько велик, что не помещается в буфер, тогда Ваш трюк с перестановкой указателя в начало потом в конец файла может сработать.

Поэтому на данный момент открывайте файл, проверяйте содержимое, потом снова закрывайте

 
Slava :

Эксперт, который читает файл, должен держать этот файл закрытым.

Особенность реализации файлов в MQL5 такова, что они по максимуму держат данные из файлов в собственных буферах. Если объём информации настолько велик, что не помещается в буфер, тогда Ваш трюк с перестановкой указателя в начало потом в конец файла может сработать.

Поэтому на данный момент открывайте файл , проверяйте содержимое, потом снова закрывайте

Так что FileFlush () бесполезен?
 
Alain Verleyen:
Так что FileFlush () бесполезен?

Нет. FileFlush надо делать обязательно, если хотите, чтобы кто-то ещё смог прочитать изменённый файл

Проблема в том, что MQL5 программа при открытии читает файл в собственный буфер. И ничего не узнает о том, что в файле что-то изменилось, пока снова не прочитает файл. Снова прочитать файл можно только при закрытии и последующем открытии этого файла

 
Slava:
Нет. FileFlush надо делать обязательно, если хотите, чтобы кто-то ещё смог прочитать изменённый файл

Даже если закрывать файл?

 
Andrey Barinov:

Даже если закрывать файл?

Я как раз об этом и говорю. Закрыть, потом снова открыть

Или Вы имеете в виду FileFlush перед закрытием файла?

 
Slava :

Нет. FileFlush надо делать обязательно, если хотите, чтобы кто-то ещё смог прочитать изменённый файл

Проблема в том, что MQL5 программа при открытии читает файл в собственный буфер. И ничего не узнает о том, что в файле что-то изменилось, пока снова не прочитает файл. Снова прочитать файл можно только при закрытии и последующем открытии этого файла

Слава, это проблема именно. Пожалуйста, посмотрите на ссылку, которую я публикую выше, вы найдете код для его воспроизведения.

Тот же файл открывается из одного советника, 1 дескриптор для записи, 2-й для чтения, fileflush используется после записи, попробуйте прочитать, и это не работает правильно.

Конечно, если вы закрываете / открываете, это работает, но тогда нет необходимости использовать FileFlush.

 
Alain Verleyen:

Слава, это проблема именно. Пожалуйста, посмотрите на ссылку, которую я публикую выше, вы найдете код для его воспроизведения.

Тот же файл открывается из одного советника, 1 дескриптор для записи, 2-й для чтения, fileflush используется после записи, попробуйте прочитать, и это не работает правильно.

Конечно, если вы закрываете / открываете, это работает, но тогда нет необходимости использовать FileFlush.

Я понимаю описанную Вами проблему.

1-й советник пишет файл. Он может не закрывать этот файл, но в таком случае должен вызывать FileFlush

2-й советник читает файл. Он должен каждый раз открывать файл, потом закрывать.

Открытие и закрытие файла только для второго советника!

 
Slava:

Я как раз об этом и говорю. Закрыть, потом снова открыть

Или Вы имеете в виду FileFlush перед закрытием файла?

Да, нужно ли флашить перед закрытием? Или закрытие гарантирует актуальность записанного файла.

 
Andrey Barinov :

Да, нужно ли флашить перед закрытием? Или закрытие гарантирует актуальность записанного файла.

Промывка бесполезна, если вы закрываете сразу после.