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

 

Аргументы функции вычисляются не справа налево

int i = 0;
int _etLastError() { return i; }
int _tringGetCharacter( string, int ) { i = 5041; return 0; }
void OnStart()
{
    string abc = "ABC";
    ResetLastError();
    Print( ::StringGetCharacter( abc, 1024 ), ":", GetLastError()); //(*)слева направо
    Print(   _tringGetCharacter( abc, 1024 ), ":", _etLastError()); //   справа налево
}

Результат строки (*)            : 0:5041

Ожидалось в обоих случаях: 0:0

 
A100:

Аргументы функции вычисляются не справа налево

Результат строки (*)            : 0:5041

Ожидалось в обоих случаях: 0:0

Это не ошибка. Компилятор сам решает в каком порядке вычислять аргументы.

Надо просто это учитывать.

 
Koldun Zloy:

Это не ошибка. Компилятор сам решает в каком порядке вычислять аргументы.

Ошибка заключается в следующем: еще недавно порядок строго определялся https://www.mql5.com/ru/forum/1111/page2040#comment_5858419 (обратите внимание на дату и выдержку из документации: гарантируется). Потом порядок потихому поменяли (в том числе в документации), причем поменять его можно было цивилизованно - через inline https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. А как пользователь должен узнать об этом? Догадаться? Или перед использованием любого инструмента смотреть документацию?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.04
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Ошибки при компиляции и не только

#define MACRO( X )      #X
void OnStart()
{
        Print( MACRO( AC/DC    )); //нормально
        Print( MACRO( AC\\DC   )); //error: '\' - illegal escape sequence
        Print( MACRO( ABC\nDEF )); //error: '\' - illegal escape sequence
        Print( MACRO( 'ABC'    )); //error: '' - single quote needed
        Print( MACRO( "ABC     )); //error: '' - double quotes are needed
        Print( MACRO( "ABC"    )); //Результат: ABC вместо "ABC"
        Print( MACRO( '"'ABC   )); //нормально
}
 
A100:

Ошибка заключается в следующем: еще недавно порядок строго определялся https://www.mql5.com/ru/forum/1111/page2040#comment_5858419 (обратите внимание на дату и выдержку из документации: гарантируется). Потом порядок потихому поменяли (в том числе в документации), причем поменять его можно было цивилизованно - через inline https://www.mql5.com/ru/forum/1111/page2042#comment_5860752. А как пользователь должен узнать об этом? Догадаться? Или перед использованием любого инструмента смотреть документацию?

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

В С++ компилятор имеет право встраивать функцию даже если у неё нет ключевого слова inline.

В MQL нет ключевого слова inline, компилятор встраивает функции только по своему усмотрению.

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

но ведь они могут быть переданы и через регистры.

А для встроенных функций вообще нет передачи аргументов, как таковой.

 
Koldun Zloy:

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)

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.01.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
A100:

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++ и никогда не считал это проблемой.


 
Koldun Zloy:

3. Не знаю, что это Вам даст. Вы хотите запретить компилятору встраивать функции без явного указания inline?

4. Я всего лишь предположил, с чем связан был такой порядок и его отмена. Думаю, что это сделали не случайно, и теперь так будет всегда. Ничего ужасного в этом нет.

5. Вы ошибаетесь. В C++ порядок вычисления аргументов не определён.

3. Я предлагал запретить компилятору менять порядок вычисления аргументов для функций без inline 

5. Порядок вычисления определяется реализацией (компилятором) и он вполне конкретный (либо справа налево, либо слева направо), а здесь например:

void OnStart()
{
    ResetLastError();
    Print( GetLastError(), ":", StringGetCharacter( "abc", 1024 ), ":", GetLastError());
}

вообще не понятно какой порядок 2-1-3 или 2-3-1 или какой еще

Результат:   5041:0:5041

Ожидалось:      0:0:5041       слева направо или

                   5041:0:0            справа налево

 
A100:

вообще не понятно какой порядок 2-1-3 или 2-3-1 или какой еще

Не понимаю, зачем писать заведомо неоднозначный код?

 
fxsaber:

Не понимаю, зачем писать заведомо неоднозначный код?

К Вам аналогичный вопрос https://www.mql5.com/ru/forum/1111/page2037#comment_5842347

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.02
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
Причина обращения: