possible loss of data due to type conversion

 

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

Код, ниже, взят из справочника (раздел "символьные константы", почти самое начало):

//--- определим символьные константы 

   int symbol_0='0'; 
   int symbol_9=symbol_0+'9'; // получим символ '9' 
//--- выведем значения констант  
   printf("В десятичном виде: symbol_0 = %d,  symbol_9 = %d",symbol_0,symbol_9); 
   printf("В шестнадцетеричном виде: symbol_0 = 0x%x,  symbol_9 = 0x%x",symbol_0,symbol_9); 
//--- заведем константы в строку 
   string test="";
   StringSetCharacter(test,0, symbol_0);
   StringSetCharacter(test,1, symbol_9);
//--- а вот как они выглядят в строке
   Print(test); 


Возможна потеря данных в процессе преобразования типов. Если я вместо переменных напрямую пишу значения - всё нормально.
P.S. Предупреждение выдаётся в функциях StringSetCharacter. symbol_0 и symbol_9 в этих функциях не нравится компилятору.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127. uchar # Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar...
 

Используй прямое преобразование типов:

char cValue = 10;
int iValue = (int)cValue;

Но, будь очень внимателен, ведь и правда, возможна потеря данных.

 
Georgiy Merts:

Используй прямое преобразование типов:

Но, будь очень внимателен, ведь и правда, возможна потеря данных.

Спасибо)
 
Ivan2610:

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

Код, ниже, взят из справочника (раздел "символьные константы", почти самое начало):

//--- определим символьные константы 

   int symbol_0='0'; 
   int symbol_9=symbol_0+'9'; // получим символ '9' 
//--- выведем значения констант  
   printf("В десятичном виде: symbol_0 = %d,  symbol_9 = %d",symbol_0,symbol_9); 
   printf("В шестнадцетеричном виде: symbol_0 = 0x%x,  symbol_9 = 0x%x",symbol_0,symbol_9); 
//--- заведем константы в строку 
   string test="";
   StringSetCharacter(test,0, symbol_0);
   StringSetCharacter(test,1, symbol_9);
//--- а вот как они выглядят в строке
   Print(test); 


Возможна потеря данных в процессе преобразования типов. Если я вместо переменных напрямую пишу значения - всё нормально.
P.S. Предупреждение выдаётся в функциях StringSetCharacter. symbol_0 и symbol_9 в этих функциях не нравится компилятору.

Вы работаете со строками, поэтому:

    string symbol_0='0'; 

а дальше - выбирайте вариант из 3-х, который по душе:

        string symbol_9=symbol_0+'9'; // получим символ '09' 

     string symbol_9=StringToInteger(IntegerToString(StringToInteger(symbol_0)+StringToInteger('9'))); // получим символ '9'  

string symbol_9=StringToInteger(IntegerToString(StringToInteger(symbol_0+'9'))); // получим символ '9'  

 
Renat Akhtyamov:

Вы работаете со строками, поэтому:

    string symbol_0='0'; 

а дальше - выбирайте вариант из 3-х, который по душе:

        string symbol_9=symbol_0+'9'; // получим символ '09' 

     string symbol_9=StringToInteger(IntegerToString(StringToInteger(symbol_0)+StringToInteger('9'))); // получим символ '9'  

string symbol_9=StringToInteger(IntegerToString(StringToInteger(symbol_0+'9'))); // получим символ '9'  

Спасибо)

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

Но компилятор ругался на следующие строчки кода:

StringSetCharacter(test,0, symbol_0);
StringSetCharacter(test,1, symbol_9);

В этих строчках происходит неявное приведение из типа int в тип ushort. В разделе приведение типов указано, что это приведение может происходить с потерями, что компилятор и говорит.
Если изменить на: 
StringSetCharacter(test,0, Ushort(symbol_0));
То компилятор предупреждений не выдаёт, но возможные потери при приведении это не отменяет.
Тип ushort - 65535 значений, а тип int - намного больше.
Насколько я понял, если мы пытаемся засунуть в тип ushort значение большее, чем 65535, то результат получается эквивалентным этому выражению: N % 65535 ( остаток от деления искомого числа N на 65535).
Для char всё аналогично, только вместо 65535 - 255 и помнить, что нулевое - это (-128), а 255 - (+127).

Функция print выводит код символа, если в качестве параметра передать ей переменную с типом char, uchar, ushort.
Вроде с этим я разобрался...

 
Georgiy Merts:

Используй прямое преобразование типов:

Но, будь очень внимателен, ведь и правда, возможна потеря данных.

Из чара в инт потери то не будет, наоборот когда. А вообще компилятор хороший должен ВСЕГДА об этом предупреждать, т.к. как бы вы не делали преобразование, в инт информации больше чем в чаре. Это значит вы допустили такое при проектировании проекта, если вы знаете что все будет норм, забейте на предупреждение, иначе проектируйте изначально без таких недостатков.
 
Сделал по примеру с МТ4 "СТРОКИ: ТАБЛИЦА СИМВОЛОВ ASCII И ЕЁ ИСПОЛЬЗОВАНИЕ"

//+------------------------------------------------------------------+
//| StringLowerCase |
//+------------------------------------------------------------------+
string StringLowerCase(string str)
  {
   string s = str;
   int lenght = StringLen(str) - 1, symbol;
   while(lenght >= 0)
     {
      symbol = StringGetChar(s, lenght);
      if((symbol > 64 && symbol < 91) || (symbol > 191 && symbol < 224))
         s = StringSetChar(s, lenght, symbol + 32);// тут possible loss of data due to type conversion
      else
         if(symbol > -65 && symbol < -32)
            s = StringSetChar(s, lenght, symbol + 288);// тут possible loss of data due to type conversion
      lenght--;
     }
   return(s);
  }
//+------------------------------------------------------------------+
//| StringUpperCase |
//+------------------------------------------------------------------+
string StringUpperCase(string str)
  {
   string s = str;
   int lenght = StringLen(str) - 1, symbol;
   while(lenght >= 0)
     {
      symbol = StringGetChar(s, lenght);
      if((symbol > 96 && symbol < 123) || (symbol > 223 && symbol < 256))
         s = StringSetChar(s, lenght, symbol - 32);// тут possible loss of data due to type conversion
      else
         if(symbol > -33 && symbol < 0)
            s = StringSetChar(s, lenght, symbol + 224);// тут possible loss of data due to type conversion
      lenght--;
     }
   return(s);
  }

Если не сложно помоги пожалуйста исправить..
 

Пример конвертаци на лету. Не благодарите!!!

int PONIT=(int)DOTS(iTime(_Symbol,PERIOD_CURRENT,w));

Причина обращения: