Ошибки, баги, вопросы - страница 2116
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Аргументы функции вычисляются не справа налево
Результат строки (*) : 0:5041
Ожидалось в обоих случаях: 0:0
Аргументы функции вычисляются не справа налево
Результат строки (*) : 0:5041
Ожидалось в обоих случаях: 0:0
Это не ошибка. Компилятор сам решает в каком порядке вычислять аргументы.
Надо просто это учитывать.
Это не ошибка. Компилятор сам решает в каком порядке вычислять аргументы.
Ошибка заключается в следующем: еще недавно порядок строго определялся https://www.mql5.com/ru/forum/1111/page2040#comment_5858419 (обратите внимание на дату и выдержку из документации: гарантируется). Потом порядок потихому поменяли (в том числе в документации), причем поменять его можно было цивилизованно - через inline https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. А как пользователь должен узнать об этом? Догадаться? Или перед использованием любого инструмента смотреть документацию?
Ошибки при компиляции и не только
Ошибка заключается в следующем: еще недавно порядок строго определялся https://www.mql5.com/ru/forum/1111/page2040#comment_5858419 (обратите внимание на дату и выдержку из документации: гарантируется). Потом порядок потихому поменяли (в том числе в документации), причем поменять его можно было цивилизованно - через inline https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. А как пользователь должен узнать об этом? Догадаться? Или перед использованием любого инструмента смотреть документацию?
Просто не нужно писать код, зависящий от порядка вычисления аргументов.
В С++ компилятор имеет право встраивать функцию даже если у неё нет ключевого слова inline.
В MQL нет ключевого слова inline, компилятор встраивает функции только по своему усмотрению.
Порядок вычисления справа налево видимо был связан с тем, что аргументы в таком порядке помещаются в стек,
но ведь они могут быть переданы и через регистры.
А для встроенных функций вообще нет передачи аргументов, как таковой.
1. Просто не нужно писать код, зависящий от порядка вычисления аргументов.
2. В С++ компилятор имеет право встраивать функцию даже если у неё нет ключевого слова inline.
3. В MQL нет ключевого слова inline, компилятор встраивает функции только по своему усмотрению.
4. Порядок вычисления справа налево видимо был связан с тем, что аргументы в таком порядке помещаются в стек,
но ведь они могут быть переданы и через регистры.
5. А для встроенных функций вообще нет передачи аргументов, как таковой.
1. Почему не нужно, если обратный порядок гарантировался документацией и при этом код получался более простым и понятным. С таким же успехом можно отрицать использование приоритета операций 5 + 2*3 и требовать расставлять везде скобки (5 + (2*3)) - на случай если его вдруг поменяют
2. С++ компилятор предъявляет к встраиваемым функциям определенные требования исключая подобную ситуацию https://www.mql5.com/ru/forum/1111/page2136#comment_6454818
3. Так его и предлагалось ввести
4. В регистры (в отличие от стека) аргументы можно поместить в любом порядке в том числе и в обратном
5. Важен порядок не передачи, а вычисления аргументов. А он есть для любой функции с более чем одним аргументом. И С++ учитывает это перед тем как сделать (или не сделать) функцию встраиваемой (см.п.2)
1. Почему не нужно, если обратный порядок гарантировался документацией и при этом код получался более простым и понятным. С таким же успехом можно отрицать использование приоритета операций 5 + 2*3 и требовать расставлять везде скобки (5 + (2*3)) - на случай если его вдруг поменяют
2. С++ компилятор предъявляет к встраиваемым функциям определенные требования исключая подобную ситуацию https://www.mql5.com/ru/forum/1111/page2136#comment_6454818
3. Так его и предлагалось ввести
4. В регистры (в отличие от стека) аргументы можно поместить в любом порядке в том числе и в обратном
5. Важен порядок не передачи, а вычисления аргументов. А он есть для любой функции с более чем одним аргументом. И С++ учитывает это перед тем как сделать (или не сделать) функцию встраиваемой (см.п.2)
3. Не знаю, что это Вам даст. Вы хотите запретить компилятору встраивать функции без явного указания inline?
2. Не понимаю о чём Вы.
4. Я всего лишь предположил, с чем связан был такой порядок и его отмена. Думаю, что это сделали не случайно, и теперь так будет всегда. Ничего ужасного в этом нет.
5. Вы ошибаетесь. В C++ порядок вычисления аргументов не определён.
1. Я много лет пишу на C++ и никогда не считал это проблемой.
3. Не знаю, что это Вам даст. Вы хотите запретить компилятору встраивать функции без явного указания inline?
4. Я всего лишь предположил, с чем связан был такой порядок и его отмена. Думаю, что это сделали не случайно, и теперь так будет всегда. Ничего ужасного в этом нет.
5. Вы ошибаетесь. В C++ порядок вычисления аргументов не определён.
3. Я предлагал запретить компилятору менять порядок вычисления аргументов для функций без inline
5. Порядок вычисления определяется реализацией (компилятором) и он вполне конкретный (либо справа налево, либо слева направо), а здесь например:
вообще не понятно какой порядок 2-1-3 или 2-3-1 или какой еще
Результат: 5041:0:5041
Ожидалось: 0:0:5041 слева направо или
5041:0:0 справа налево
вообще не понятно какой порядок 2-1-3 или 2-3-1 или какой еще
Не понимаю, зачем писать заведомо неоднозначный код?
Не понимаю, зачем писать заведомо неоднозначный код?
К Вам аналогичный вопрос https://www.mql5.com/ru/forum/1111/page2037#comment_5842347