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

 
. ... Rick D. ... .:

Знаменитый вопрос на собеседовании.

тупой, ненужный вопрос, который выявляет только то, знает ли собеседуемый что такое UB. и мало относится к теме обсуждения.

Aleksey Rodionov:
Сижу и соображаю, как может пригодится код префиксной формы ?

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

 
Slava:

Откуда дровишки? Вы сравнивали результаты операций array[++i]=i и array[i++]=i?

Вопрос на засыпку. Чем отличается постфиксная операция от префиксной операции?

а при чем тут array[++i]=i и array[i++]=i, как я могу сравнить то, чего не было в беседе...

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

и еще, покажите тут всем указания в справке по mql про разницу в постфиксных и префиксных операций, а вот тесты прошлых лет мне говорят о том, что в mql эти операции ранее равнозначны были

ps. кстати специально сейчас проверил пример из диалога

int i = 5;
i = i++ + ++i;

билд 1816 результат == 12

 
TheXpert:

тупой, ненужный вопрос, который выявляет только то, знает ли собеседуемый что такое UB. и мало относится к теме обсуждения.

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

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

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

Код должен быть прозрачен и понятен с первого взгляда.

 
Georgiy Merts:

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

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

Код должен быть прозрачен и понятен с первого взгляда.

просто справку по mql5 уже пора изменить на форму соглашений и правил по языку

[Удален]  
Подскажите вопрос по частичному закрытию позиции, тип счета RETAIL_HEDGING. Например я закрываю из эксперта половину позиции, должен автоматом открыться новый ордер меньшим лотом. Так вот, в какой момент новый ордер гарантированно будет в терминале? Правильно ли я понимаю, что сразу он появиться после PositionClosePartial не обязан и его нужно ловить где-нибудь в OnTrade ?
 
Konstantin:

а при чем тут array[++i]=i и array[i++]=i, как я могу сравнить то, чего не было в беседе...

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

и еще, покажите тут всем указания в справке по mql про разницу в постфиксных и префиксных операций, а вот тесты прошлых лет мне говорят о том, что в mql эти операции ранее равнозначны были

ps. кстати специально сейчас проверил пример из диалога

билд 1816 результат == 12

А при том, что примеры эти ваши - чисто теоретические. Чисто для студентов. Ни один программист в здравом уме не выпустит такое в продакшен.

Постфиксные и префиксные инкремент и декремент реально используются прежде всего в циклах. Они и называются инкремент и декремент!

Вот примеры

int i=0;
while(i<ArraySize(array))
   array[i++]=i;

и

int i=0;
while(i<ArraySize(array))
   array[++i]=i;

Если Вы утверждаете, что префиксные и постфиксные операции работают одинаково, то флаг Вам в руки и барабан на шею.

В случае с префиксным инкрементом, вы получите неинициализированным нулевой элемент массива и ошибку array out of range на последней итерации.


PS. Решил перечитать нашу документацю по этому вопросу по зелёной ссылке https://www.mql5.com/ru/docs/basis/operations/mathoperation

Важное замечание

int i=5;
int k = i++ + ++i;

Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в другую (например, из Borland C++ в MQL5). В общем случае порядок вычислений зависит от реализации компилятора. На практике существуют два способа реализации постдекремента (постинкремента):

  1. постдекремент (постинкремент) применяется к переменной после вычисления всего выражения;
  2. постдекремент (постинкремента) применяется к переменной сразу по месту операции.

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

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Slava:

А при том, что примеры эти ваши - чисто теоретические. Чисто для студентов. Ни один программист в здравом уме не выпустит такое в продакшен.

Постфиксные и префиксные инкремент и декремент реально используются прежде всего в циклах. Они и называются инкремент и декремент!

Вот примеры

и

Если Вы утверждаете, что префиксные и постфиксные операции работают одинаково, то флаг Вам в руки и барабан на шею.

В случае с префиксным инкрементом, вы получите неинициализированным нулевой элемент массива и ошибку array out of range на последней итерации.

может до вашего высокого ума не доходит, еще раз повторю свой вопрос

а при чем тут array[++i]=i и array[i++]=i, как я могу сравнить то, чего не было в беседе...

вам выделенное уже не по глазам?

а теперь к делу, почему в примере который фигурирует в беседе, результат в mql == 12 и не важно высосан он из пальца или нет, при разнице в постфиксных и префиксных операциях, результат должен быть == 13

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

кстати справку смотрю уже перелопатили ))

 
Konstantin:

может до вашего высокого ума не доходит, еще раз повторю свой вопрос

вам выделенное уже не по глазам?

а теперь к делу, почему в примере который фигурирует в беседе, результат в mql == 12 и не важно высосан он из пальца или нет, при разнице в постфиксных и префиксных операциях, результат должен быть == 13

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

кстати справку смотрю уже перелопатили ))

Не хамите.

Кто сказал, что результат должен быть 13? Повторяю, результаты с сайд-эффектами сильно зависят от оптимизации. Даже если к такому выражению не применять оптимизацию, тогда вступает в дело реализация - изменение значения переменной либо сразу после использования, либо после вычисления выражения. Какая из реализаций является правильной?

Мы не собираемся разбираться с UB, на то оно и undefined, и явно написали: "не делайте так"

В каком месте перелопатили справку? Вот я открыл MQL5 reference из MetaEditor билда 1755 от 18 января. Там то же самое написано

Important Notice

int i=5;
int k = i++ + ++i;

Computational problems may occur while moving the above expression from one programming environment to another one (for example, from Borland C++ to MQL5). In general, the order of computations depends on the compiler implementation. In practice, there are two ways to implement the post-decrement (post-increment):

  1. The post-decrement (post-increment) is applied to the variable after calculating the whole expression.
  2. The post-decrement (post-increment) is applied to the variable immediately at the operation.

Currently the first way of post-decrement (post-increment) calculation is implemented in MQL5. But even knowing this peculiarity, it is not recommended to experiment with its use.


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

 
Slava:

Не хамите.

Кто сказал, что результат должен быть 13? Повторяю, результаты с сайд-эффектами сильно зависят от оптимизации. Даже если к такому выражению не применять оптимизацию, тогда вступает в дело реализация - изменение значения переменной либо сразу после использования, либо после вычисления выражения. Какая из реализаций является правильной?

Мы не собираемся разбираться с UB, на то оно и undefined, и явно написали: "не делайте так"

В каком месте перелопатили справку? Вот я открыл MQL5 reference из MetaEditor билда 1755 от 18 января. Там то же самое написано

Important Notice

int i=5;
int k = i++ + ++i;

Computational problems may occur while moving the above expression from one programming environment to another one (for example, from Borland C++ to MQL5). In general, the order of computations depends on the compiler implementation. In practice, there are two ways to implement the post-decrement (post-increment):

  1. The post-decrement (post-increment) is applied to the variable after calculating the whole expression.
  2. The post-decrement (post-increment) is applied to the variable immediately at the operation.

Currently the first way of post-decrement (post-increment) calculation is implemented in MQL5. But even knowing this peculiarity, it is not recommended to experiment with its use.


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

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

по справке - да, ее сильно перелопатили т.к. когда разбирался (примерно года два назад) с постфикс и префикс операциями в mql, то этого материала, что сейчас явно не помню

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

[Удален]  
. ... Rick D. ... .:
Подскажите вопрос по частичному закрытию позиции, тип счета RETAIL_HEDGING. Например я закрываю из эксперта половину позиции, должен автоматом открыться новый ордер меньшим лотом. Так вот, в какой момент новый ордер гарантированно будет в терминале? Правильно ли я понимаю, что сразу он появиться после PositionClosePartial не обязан и его нужно ловить где-нибудь в OnTrade ?
Попробую сам ответить на свой вопрос. При вызове PositionClosePartial тикет закрытого ордера вернется в CTrade::ResultOrder(), а тикет позиции останется тем-же, но сама позиция будет с уменьшенным лотом. Попробую сделать вывод, что вызов PositionClosePartial ведет к синхронному уменьшению позиции и изменению истории ордеров одной транзакцией.