Скачать MetaTrader 5

Неявное преобразование строки в число без предупреждения

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Stanislav Korotky
22516
Stanislav Korotky  

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

Пример:

string Instruments[1];
string Instrument = "abc";

void Func(int number)
{
  Print("number=", number);
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  Instruments[0] = "String";
  Func(Instruments[0]); // no warning
  Func(Instrument);     // no warning
  Func("String");       // warning
}
//+------------------------------------------------------------------+
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
Ilyas
1213
Ilyas  
спасибо, будем разбираться.

Andrey Voytenko
25080
Andrey Voytenko  

Интересно, а что Вы хотели увидеть в результате вызова?

Func("String"); 

Напомню что строки в MQL5 передаются по ссылке. Но дело в том, что оперативная память под строковые константы типа "String" не выделяется, эта строка хранится прямо в теле скомпилированного советника (в Вашем случае скрипта). Т.е. нет адреса в оперативной памяти, который можно было бы передать.

Поэтому вас предупредили, что конвертация string->int будет некорректной. В остальных случаях оперативная память выделяется в явном виде и преобразование типов происходит успешно!  

Простак
315
Простак  
avoitenko:

Интересно, а что Вы хотели увидеть в результате вызова?

Напомню что строки в MQL5 передаются по ссылке. Но дело в том, что оперативная память под строковые константы типа "String" не выделяется, эта строка хранится прямо в теле скомпилированного советника (в Вашем случае скрипта). Т.е. нет адреса в оперативной памяти, который можно было бы передать.

Поэтому вас предупредили, что конвертация string->int будет некорректной. В остальных случаях оперативная память выделяется в явном виде и преобразование типов происходит успешно!  

Компилятор должен быть последователен и предупреждать либо во всех аналогичных случаях, либо ни в каких. Вот это и хотел увидеть автор оригинального сообщения.

Stanislav Korotky
22516
Stanislav Korotky  
simpleton:

Компилятор должен быть последователен и предупреждать либо во всех аналогичных случаях, либо ни в каких. Вот это и хотел увидеть автор оригинального сообщения.

Автор просто приложил тесткейс. ;-) Func("String") - единственный случай, отработавший штатно.

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

Ilyas
1213
Ilyas  
Исправлено. Добавлено сообщение о потере точности при передаче параметров (например передача double в качестве int).
Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий