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

 
Slava:

При данном кастинге нет потери данных. Либо 0, либо не 0.

Другое дело, когда имеет место кастинг double -> любой целочисленный тип (до int32 включительно)

Что-то вы заигрались с предупреждениями на мой взгляд, не хватает последовательности в суждениях

bool continuation()const {return this.last_level;}  // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict:

Что-то вы заигрались с предупреждениями на мой взгляд, не хватает последовательности в суждениях

Согласен

Здесь тоже в этом смысле нет потери данных (либо 0, либо не 0)

void OnStart()
{
        int i = -1;
        while ( ++i ); //Warning: expression not boolean
}

а предупреждение есть. Ожидалось единообразие подхода

 

Результат попытки доступа к свойству экземпляра класса из статической функции этого же класса:

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
Компилятор до этого молчал.
 

Не инициализирует пустую строку терминальным нулём.

void OnStart()
{      
   string str;
   StringInit(str, 100, 0);
   
   Print(StringLen(str));     
}

Результат

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  0

Ожидалось

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  100

Примечание в справке к функции StringInit

Примечание

Если  character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

По факту не какого распределения не происходит.
т.е распределение таким способом, десять пробелов

string str = "          ";

не то же самое, что

string str;
StringInit(str, 10, 0);

И как то не сходится логика поведения, в тексте справки выделенное красным.

 
Vict:

Что-то вы заигрались с предупреждениями на мой взгляд, не хватает последовательности в суждениях

не работают на булевые операции предупреждения, сейчас случайно заметил опечатку в коде у себя, вот воспроизвел:

#define              getAsk(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define              getBid(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_BID)
//+------------------------------------------------------------------+
void OnStart()
  {
      double sl = 0.0,tp=0.0;
      if(sl != !OrderStopLoss() || tp != OrderTakeProfit()) Print("");  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return(getAsk());
}

double OrderTakeProfit()
{
   return(getBid());
}
 
Roman:

Не инициализирует пустую строку терминальным нулём.

Результат

Ожидалось

Примечание в справке к функции StringInit

По факту не какого распределения не происходит.
т.е распределение таким способом, десять пробелов

не то же самое, что

И как то не сходится логика поведения, в тексте справки выделенное красным.

Вы упустили из виду функцию StringBufferLen - она возвращает размер выделенного буфера. StringLen возвращает длину строки, то есть до терминального символа, соответственно, если он в самом начале - длина 0. Буфер != строка.

 
Stanislav Korotky:

Вы упустили из виду функцию StringBufferLen - она возвращает размер выделенного буфера. StringLen возвращает длину строки, то есть до терминального символа, соответственно, если он в самом начале - длина 0. Буфер != строка.

А то он сам не знает

 
Stanislav Korotky:

Вы упустили из виду функцию StringBufferLen - она возвращает размер выделенного буфера.
StringLen возвращает длину строки, то есть до терминального символа, соответственно, если он в самом начале - длина 0. Буфер != строка.

Это понятно, речь об инициализации строки терминальными нулями.
Почему бы в StringInit(str, 10, 0); не заполнить десятью терминальными нулями ? И вернуть реальную длину строки. 
Если нужно инициализировать пустую строку, без заполнения! к примеру в 100 символов,
тогда или 100 пробелов в виде str = " много тыканий в клаву ", или инициализировать мусором StringInit(str, 100, 65)
Не пойму зачем инициализировать мусором, его и так хватает ))


 
Roman:

Это понятно, речь об инициализации строки терминальными нулями.
Почему бы в StringInit(str, 10, 0); не заполнить десятью терминальными нулями ? И вернуть реальную длину строки. 
Если нужно инициализировать пустую строку, без заполнения! к примеру в 100 символов,
тогда или 100 пробелов в виде str = " много тыканий в клаву ", или инициализировать мусором StringInit(str, 100, 65)
Не пойму зачем инициализировать мусором, его и так хватает ))


А с чего взяли, что не заполняется? Просто длина в мкл стринге не хранится, а узнаётся по терминальному нулю.

StringInit(str, 100, ' ');

не?

А если нужны именно нули, то где-то в недрах мкл стд есть класс String.

 
Vict:

А с чего взяли, что не заполняется? Просто длина в мкл стринге не хранится, а узнаётся по терминальному нулю.

не?

А если нужны именно нули, то где-то в недрах мкл стд есть класс String.

Не.. Так тоже возвращает ноль. Да и третий параметр ushort, требует целочисленный код символа.

Если инициализирую в виде str = "      "; а потом передаю данные из dll то всё норм.
А если инициализирую StringInit(str, 10, 0) то данные не поступают. Потому что не выделена память для строки нужного размера.

Если бы был код для пробела, возможно бы и сработало, но что то я не нашёл такой код в разных таблицах.
Нужно выделить именно память под количество будущих символов, которые потом поступят в уже инициализированную, пустую строку.
Но мусором инициализировать строку, не комильфо.
По этому StringInit(str, 100, 0); должен заполняться терминальными нолями, и возращать длину 100.

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