Новая версия платформы MetaTrader 5 build 2360: Расширение интеграции с SQLite - страница 36

 

Баг компилятора. Неправильно определяет sizeof для приведённых типов:

void OnStart()
{
  int i;
  
  Print(sizeof((char)i)); // Выводит 4
  
  int static_assert[ sizeof((char)i) == 1 ]; // '[' - invalid index value
}

А должно быть 1

 
Alexey Navoykov:

Баг компилятора. Неправильно определяет sizeof для приведённых типов:

А должно быть 1

Нет

С помощью операции sizeof можно определить размер памяти которая соответствует идентификатору или типу.

Размер памяти, а не сам размер

int s_s = sizeof(char);
s_s = 1
 
prostotrader:

Нет

С помощью операции sizeof можно определить размер памяти которая соответствует идентификатору или типу.

Размер памяти, а не сам размер

Ну про размер памяти и речь.  Что значит "а не сам размер" - я не очень понял.  Вы внимательно читали мой пост?


Дополню.  Данный баг происходит даже в том случае, когда фактической конверсии типов нет:

char i;
Print(sizeof((char)i)); // Выводит 4
 
Alexey Navoykov:

Дополню.  Данный баг происходит даже в том случае, когда фактической конверсии нет:

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

даже такой код не корректно работает:

void OnStart()
{
   int i=1;
   Print(sizeof(char(char(i)))); // 4
}

UPD: да, через int все что меньше 4-х байт приводится  https://www.mql5.com/ru/docs/basis/types/casting


 
Igor Makanu:

UPD: да, через int все что меньше 4-х байт приводится  https://www.mql5.com/ru/docs/basis/types/casting

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

Блин, вот уж не думал, что даже такой примитив, как sizeof, придётся оборачивать в макрос ))  MQL лёгких путей не любит.

#define  sizeof(T)  ( typename(T)=="char" || typename(T)=="uchar" ? 1  : typename(T)=="short" || typename(T)=="ushort" ? 2  : typename(T)=="int" || typename(T)=="uint" ? 4  : sizeof(T) )
 
Alexey Navoykov:

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

Блин, вот уж не думал, что даже такой примитив, как sizeof, придётся оборачивать в макрос ))  MQL лёгких путей не любит.

Вы сам себе выдумываете трудности и героически их преодолеваете.

void OnStart()
{
  char i;
  Print(sizeof(i)); // Выводит 1
}
 
Alexey Viktorov:

Вы сам себе выдумываете трудности и героически их преодолеваете.

Что-то ваш код шибко сложный.  Давайте ещё упростим:

Print(1); // Выводит 1
 
Alexey Navoykov:

Что-то ваш код шибко сложный.  Давайте ещё упростим:

А на более сложные чего не хватает?

void OnStart()
 {
  char i = 123;
  Print(sizeof(i)); // Выводит 1
 }

Явное преобразование типа переменной может только увеличить размер.

void OnStart()
 {
  char i = 123;
  Print(sizeof((int)i)); // Выводит 4
 }

void OnStart()
 {
  char i = 123;
  Print(sizeof((double)i)); // Выводит 8
 }
 
Alexey Viktorov:

Явное преобразование типа переменной может только увеличить размер.

Зачем выдумываете что попало?


Интересно, а что здесь печатает (терминал не установлен)?   

char c1 = 2;
char c2 = 2;
Print(sizeof(c1+c2));


 
Alexey Navoykov:

Ну про размер памяти и речь.  Что значит "а не сам размер" - я не очень понял.  Вы внимательно читали мой пост?


Дополню.  Данный баг происходит даже в том случае, когда фактической конверсии типов нет:

Значит, при преобразовании типов резервируется 4 байта

Ведь

char i = 2;
  int s_s = sizeof(i);

s_s =1

Если сделать так

char i = 2;
  char s_s = sizeof(char(i));
  s_s = sizeof(s_s)

то s_s = 1

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