MetaTrader 5 build 2121: Новое оформление тестера стратегий - страница 7

 
Roman:

Добавил в тест StringLen, и инициализировал строку по другому. В документации одно, по факту совсем другое поведение.
И буфер в этом случае показывает 0 а не 260.

В документации указано, когда возвращается 0 и он подходит для указанного случая

 
A100:

В документации указано, когда возвращается 0 и он подходит для указанного случая

Документация вообще не соответствует текущему поведению!

В чём разница двух видов инициализации?

StringInit(str, 1, "_");
string str = "_";
А результаты разные ))
И вообще не понятно откуда лезет левое число 260.
 
Roman:

Документация вообще не соответствует текущему поведению!

Документация: Значение 0 означает, что строка – константная и содержимое буфера менять нельзя.

Строка инициализирована константой "_" и компилятор считает строку условно (для целей эффективности) константной - почему бы и нет? В чем противоречие? Тем более что далее с ней не происходит никаких операций.

 
Roman:
И вообще не понятно откуда лезет левое число 260.

Модератор пояснил откуда, а почему оно в случае

string str = "_";

не появляется - повод для проверки

 
A100:

Модератор пояснил откуда

С числом 260 вроде понял, компилятор сам выделяет буферу StringBufferLen  начальный размер в 260.
И если длина строки меньше 260, то StringBufferLen выводит именно 260, а не реальную длину строки!
А если длина строки больше 260, тогда выводиться реальное значение строки.

То есть пользуясь функцией StringBufferLen,  с длиной строки менее 260 символов, мы не получим реальную длину строки, и будем получать всегда 260.
Видимо в этом и есть ошибка.
Как только срока превысит 260 символов, тогда получаем реальное значение длины.

p.s. так как документация устаревшая это жесть как вводит в заблуждение.

 
Roman:

То есть пользуясь функцией StringBufferLen,  с длиной строки менее 260 символов, мы не получим реальную длину строки, и будем получать всегда 260.
Видимо в этом и есть ошибка.
Как только срока превысит 260 символов, тогда получаем реальное значение длины.

Строго говоря длина строки: StringLen, а длина буфера: StringBufferLen - довольно редкая функция. И в общем случае они могут и не совпадать

Итого два как минимум сомнительных случая:

void OnStart() 
{ 
        string s1 = "_";
        Print(StringBufferLen(s1)); //(1)//Ожидалось 260 вместо 0 - строка s1 далее может быть увеличена
        StringInit(s1,1,'_');
        const string s2 = s1;
        Print(StringBufferLen(s2)); //(2)//Ожидалось 0\1 вместо 260 - строка s2 константная и не может быть далее увеличена
}
 
まだ、ストラテジーテスターのオプティマイズの不具合が修正されていません。
修正してください。
私が使っている最適化設定は、バランス+シャープレシオですが、スクリーンショットの画像のように、異常な最適化数値が表示され、以降の最適化のジェネレーションにこの異常値による正常な最適化が不可能になっています。

To MetaQuotes Software Corp.
The strategy tester optimization bug has not been fixed yet.
Please correct.
The optimization setting I use is balance + sharp ratio, but an abnormal optimization value is displayed as in the screenshot, and normal optimization due to this abnormal value is generated in the subsequent optimization generation. It is impossible.

Ошибка оптимизации тестера стратегий еще не исправлена.
Пожалуйста, исправьте это.
Оптимизация, которую я использую, - это баланс + резкое соотношение, но ненормальное значение оптимизации отображается, как на скриншоте, и в последующем генерации оптимизации создается нормальная оптимизация из-за этого ненормального значения. Это невозможно
 
Длина строки - это StringLen. А StringBufferLen показывает преаллоцированный размер памяти.

Преаллоцированный размер памяти строки - это внутреннее дело компилятора и нельзя на него закладываться.
 
Renat Fatkhullin:
Преаллоцированный размер памяти строки - это внутреннее дело компилятора и нельзя на него закладываться.

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

  • Для константной строки памяти выделяется больше чем нужно (ее длину увеличить будет нельзя принципиально )
  • Для неконстантной строки дополнительной памяти не выделяется (при увеличении ее длины, потребуется новое распределение памяти)
  • Если пользователь инициализирует строку через StringInitInit, то памяти выделяется больше, чем нужно, потому что размер буфера пользователем задан явно и в подавляющем большинстве случаев он не будет увеличен (пользователь уже сам подумал какой конечный буфер ему нужен и задал его размер явно)
 
A100:

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

  • Для константной строки памяти выделяется больше чем нужно (ее длину увеличить будет нельзя принципиально )
  • Для неконстантной строки дополнительной памяти не выделяется (при увеличении ее длины, потребуется новое распределение памяти)
  • Если пользователь инициализирует строку через StringInitInit, то памяти выделяется больше, чем нужно, потому что размер буфера пользователем задан явно и в подавляющем большинстве случаев он не будет увеличен (пользователь уже сам подумал какой конечный буфер ему нужен и задал его размер явно)

Размер преаллокации буферов под строки - это внутреннее дело компилятора.

Мы еще неоднократно будем менять работу со строками.