possible loss of data due to type conversion

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ivan2610
14
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 в этих функциях не нравится компилятору.

Документация по 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...
Georgiy Merts
9023
Georgiy Merts  

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

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

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

Ivan2610
14
Ivan2610  
Georgiy Merts:

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

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

Спасибо)
Renat Akhtyamov
15187
Renat Akhtyamov  
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'  

Ivan2610
14
Ivan2610  
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.
Вроде с этим я разобрался...

Aleksey Mavrin
1413
Aleksey Mavrin  
Georgiy Merts:

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

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

Из чара в инт потери то не будет, наоборот когда. А вообще компилятор хороший должен ВСЕГДА об этом предупреждать, т.к. как бы вы не делали преобразование, в инт информации больше чем в чаре. Это значит вы допустили такое при проектировании проекта, если вы знаете что все будет норм, забейте на предупреждение, иначе проектируйте изначально без таких недостатков.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий