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

 
fxsaber:
Это ноль.

Да, понял. Действительно откуда может быть ордер при TRADE_TRANSACTION_DEAL_ADD...

Спасибо.

 
sizeof-баг
void f( uchar &Array[] )
{
  Print(sizeof(Array));
}

void OnStart( void )
{
  uchar Bytes[1];
  
  Print(sizeof(Bytes));
  
  f(Bytes);
}

Результат
1
52
 

В процессе тестирования, в журнале не указывается время в которое происходит экспирация ордера:

2017.03.30 22:12:30.271    Core 1    2017.01.18 16:55:00   buy limit 0.01 EURUSD at 1.06789 (1.06879 / 1.06889 / 1.06889)
2017.03.30 22:12:30.271    Core 1    order expired [#4 buy limit 0.01 EURUSD at 1.06789]

Xочется, чтобы было так:

2017.03.30 22:12:30.271    Core 1    2017.01.18 17:25:00 order expired [#4 buy limit 0.01 EURUSD at 1.06789]

 
fxsaber:
sizeof-баг
Результат

Локальный массив размером в 1 байт при передаче в качестве параметра превратился в универсальный объект массива. Указатель буфера объекта реально связан с локальным массивом. но его нельзя перераспределить.

На вход функции f может быть подан любой массив, в том числе динамический

 
Slawa:

Локальный массив размером в 1 байт при передаче в качестве параметра превратился в универсальный объект массива. Указатель его буфера реально связан с локальным массивом. но его нельзя перераспределить.

На вход функции f может быть подан любой массив, в том числе динамический

Это очень интересное объяснение внутренней архитектуры. Но из-за этого sizeof выдает совершенно не то, что задумываешь, когда кодишь.

Т.е. есть некоторое несоответствие документации и становится непонятно, как кодить без проверок каждый раз.


Тем более, что если вызвать sizeof после выхода из функции, то размер определяется без влияния таких нюансов.

 

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

Что выжидать когда провайдер все плюсовые сделки закроет!

 
fxsaber:

Это очень интересное объяснение внутренней архитектуры. Но из-за этого sizeof выдает совершенно не то, что задумываешь, когда кодишь.

Т.е. есть некоторое несоответствие документации и становится непонятно, как кодить без проверок каждый раз.


Тем более, что если вызвать sizeof после выхода из функции, то размер определяется без влияния таких нюансов.

Вы внимательно прочитали в документации про sizeof?

Операция взятия размера типа данных или размера объекта любого типа данных ( sizeof )

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

Пример:

sizeof(выражение)

В качестве выражения может быть использован любой идентификатор, либо имя типа, заключенное в скобки. Отметим, что не может быть использовано имя типа void, а идентификатор не может относится к полю битов или быть именем функции.

Если в качестве выражения указано имя статического массива (то есть, задана первая размерность), то результатом является размер всего массива (т.е. произведение числа элементов на длину типа). Если в качестве выражения указано имя динамического массива (первая размерность не задана), то результатом будет размер объекта динамического массива.

Когда sizeof применяются к имени типа структуры или класса или к идентификатору имеющему тип структуры или класса, то результатом является фактический размер структуры или класса.

PS есть более прямые способы узнать размер массива

 
Slawa:

Если в качестве выражения указано имя статического массива (то есть, задана первая размерность), то результатом является размер всего массива (т.е. произведение числа элементов на длину типа).

Из цитаты оставил только кусок, который касается вышеприведенного кода. Там именно статический массив, и упомянутое Вами произведение двух чисел должно быть равно единице.

Если же после передачи массив из статического становится динамическим, а по возврату - обратно статическим, то как передать массив в статическом виде тогда?

PS есть более прямые способы узнать размер массива

sizeof хорош из-за своей универсальности - применим и к обычным типам и к массивам . А ArraySize применим только к массивам.
 
fxsaber:

Из цитаты оставил только кусок, который касается вышеприведенного кода. Там именно статический массив, и упомянутое Вами произведение двух чисел должно быть равно единице.


Ещё раз. Там где статический массив, там и показывает единицу.

Никогда параметры функции не были статическими массивами. Там - объект неизвестно заранее какого массива. Динамического, статического, таймсерии, индикаторного буфера

Как вам помогает "универсальность sizeof"? Это вам не си или си++ с прямым доступом к памяти. И то нужно быть аккуратным в интерпретации результатов sizeof. Распределите динамический массив на 1000 элементов и спросите у него sizeof. Я именно про си++ говорю - вы, похоже, удивитесь результату

А про _countof ничего не слышали?

 
Slawa:

Ещё раз. Там где статический массив, там и показывает единицу.

Никогда параметры функции не были статическими массивами. Там - объект неизвестно заранее какого массива. Динамического, статического, таймсерии, индикаторного буфера

Как вам помогает "универсальность sizeof"? Это вам не си или си++ с прямым доступом к памяти. И то нужно быть аккуратным в интерпретации результатов sizeof. Распределите динамический массив на 1000 элементов и спросите у него sizeof. Я именно про си++ говорю - вы, похоже, удивитесь результату

А про _countof ничего не слышали?

Владею немного только MQL. СИ - не знаю, поэтому не слышал.

void OnStart( void )
{
  uchar Bytes[];
  
  ArrayResize(Bytes, 100);
  
  Print(sizeof(Bytes));
}

Результат - 52. Это нормально? У меня нет никаких претензий ко внутренней архитектуре. Я просто хочу, чтобы мои представления во время кодинга не были ошибочными. Представления складываются исходя из внимательного прочтения документации и тестовых скриптов при неоднозначностях.


В данном случае нарвался в большом коде не непонятное поведение. И после длительного исследования вышел на описанный Вами нюанс, который вряд ли кому-либо на форуме очевиден. А с примером выше - вообще получается, что sizeof динамических массивов делать нельзя (результат всегда 52).

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