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

 

ух, что-то в последнем билде наворотили. .ex5 одного из индикаторов вырос в размерах почти в 10 раз по сравнению с .ex5 откомпиленом билдом ранее. Ну да это не страшно. Зато появилась ошибка при набрасывании индикатора (ещё до ввода параметров):

2012.07.27 02:53:57     MP2012_GRI (EURUSD,M30) Access violation read to 0x000000003FF39D25

Это я уже закоментарил 3\4 кода. А если ещё немного раскоментить, получу (вместе с ошибкой, которая выше):

2012.07.27 02:56:42     Custom Indicator        'MP2012_GRI' may work incorrectly, as it requires more than 256Kb of stack memory
и надо же - действительно не работает 

 А если ещё закомментировать кода немного, то первые две ошибки пропадают, зато при выгрузке индикатора получаю:

2012.07.27 02:47:35     MP2012_GRI (EURUSD,M30) 9 leaked strings left
(циферки могут быть и другими - смотря сколько закомментил кода)

 Предварительно выяснил, что у меня слишком большая функция по объёму - побью на мелкие функции.

...а в прошлом билде всё было хорошо 

 
notused:

ух, что-то в последнем билде наворотили. .ex5 одного из индикаторов вырос в размерах почти в 10 раз по сравнению с .ex5 откомпиленом билдом ранее. Ну да это не страшно. Зато появилась ошибка при набрасывании индикатора (ещё до ввода параметров):

Это я уже закоментарил 3\4 кода. А если ещё немного раскоментить, получу (вместе с ошибкой, которая выше):

Мы стали жестче контролировать окружение песочницы ради повышения безопасности.

Cообщение про стек говорит, что Вы использовали в одной из функций стека больше чем на 256 килобайт, что является серьезной проблемой в программировании. Например, в C/C++ использование функцией локального стека даже на 16 кб уже считается серьезным предупреждением.

Скорее всего Вы в функциях много выделяете статических массивов, например:

void func(void)
  {
   double arr1[128000];
   double arr2[128000];
   double arr3[128000];

  }

Так делать нельзя.

Если нужны массивы большого размера, то используйте лучше динамические массивы. Например:

double ExtArr[];

void func(void)
  {
   double arr1[];
   double arr2[];

   ArrayResize(ExtArr,128000,0);
   ArrayResize(arr1,128000,0);
   ArrayResize(arr2,128000,0);
  }
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

Мы стали жестче контролировать окружение песочницы ради повышения безопасности.

Cообщение про стек говорит, что Вы использовали в одной из функций стека больше чем на 256 килобайт, что является серьезной проблемой в программировании. Например, в C/C++ использование функцией локального стека даже на 16 кб уже считается серьезным предупреждением.

Скорее всего Вы в функциях много выделяете статических массивов, например:

Так делать нельзя.

Если нужны массивы большого размера, то используйте лучше динамические массивы. Например:

Не использую статических массивов вообще в данном индикаторе; в функции тяжелее int ничего не передаётся и т. п. Зато активно используются всякие графические ф-ии.

Например,

   ObjectSetString(0, stmp, OBJPROP_TEXT, "HB");
   ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

если последнюю строчку закомментировать - всё нормально.  Проблема в том, что таких вызовов много и этот 

ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

ничем от других не отличается - 20-й или 30-й по счёту.

 Мне кажется, что всё-таки проблема в объеме ф-ии, т. к. комментирование кода избавляет от проблемы, а большая часть кода состоит из  ObjectSetXXX. Экспериментальным путём выяснил, что бить на более мелкие части также бесполезно - агрессивный инлайнер всё-равно собирает всё в кучу и выдаёт ошибки. Можно попробовать вынести больше кода, но уже завтра. В сервис деск уже тоже завтра, если ранее не разберёмся.

 
notused:

Не использую статических массивов вообще в данном индикаторе; в функции тяжелее int ничего не передаётся и т. п. Зато активно используются всякие графические ф-ии.

Но что-то ведь огромное есть.

Например, включили локальную копию класса, который как раз имеет тонну статическим массивов в своих членах. Обычно там и прячутся залежи потребителей локального стека.


Например,

если последнюю строчка закомментировать - всё нормально.  Проблема в том, что таких вызовов много и этот 

ничем от других не отличается - 20-й или 30-й по счёту.

 Мне кажется, что всё-таки проблема в объеме ф-ии, т. к. комментирование кода избваляет от проблемы, а большая часть кода состоит из  ObjectSetXXX. Экспериментальным путём выяснил, что бить на более мелкие части также бесполезно - агрессивный инлайнер всё-равно собирает всё в кучу и выдаёт ошибки. Можно попробовать вынести больше кода, но уже завтра. В сервис деск уже тоже завтра, если ранее не разберёмся.

Делите функции, наскладывайте в классы.

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

 
Renat:

Но что-то ведь огромное есть.

Например, включили локальную копию класса, который как раз имеет тонну статическим массивов в своих членах. Обычно там и прячутся залежи потребителей локального стека.


Делите функции, наскладывайте в классы.

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

Сервис-деск #444495
 

почему так ? корявые выплаты или как !только 1 агент заработал 1 кр а за день виплат 0.3 кр  


 

В сервисдеск обязательно писать с этими заголовками:

Версия и битность терминала

...

Описание проблемы

...

Последовательность действий

...

Полученный результат

...

Ожидаемый результат

...

Дополнительные сведения

...

или можно все своими словами?

 
Zeleniy:

или можно все своими словами?

Лучше по списку. Вы этим сильно облегчите жизнь тому, кто будет заниматься багом.
 
Zeleniy:

В сервисдеск обязательно писать с этими заголовками:


или можно все своими словами?

можете все своими, но

Версия и битность терминала
Описание проблемы

Последовательность действий

Полученный результат

Ожидаемый результат

обязательно.

------------

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

 
sergeev:

можете все своими, но

Версия и битность терминала
Описание проблемы

Последовательность действий

Полученный результат

Ожидаемый результат

обязательно.

------------

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

Я выбрал раздел Сайт mql5.com  и предложение вот и не пойму как это прикрутить к заголовкам.
Причина обращения: