Что вызывает ошибку переполнения стека в mql4?

 

Что вызывает ошибку переполнения стека в mql4 при компиляции? Я подозреваю использование функции для создания объектов. Ниже приведена функция, которая была вызвана более сотни раз для создания объектов.

int ObCreate(string ObName,double Xdist,double Ydist,double Zoom)
 {
 
   ObjectCreate(ObName, OBJ_LABEL, 0, 0, 0);  // Creating obj.
   ObjectSet(ObName, OBJPROP_CORNER, 0);    // Reference corner
   ObjectSet(ObName, OBJPROP_XDISTANCE, Xdist*ZoomTimes);// X coordinate   
   ObjectSet(ObName, OBJPROP_YDISTANCE, ZoomTimes*Ydist);// Y coordinate
 return(0);
 }

Ниже приведен один пример использования.

   ObCreate("EURUSD",Column1x,15,ZoomTimes);

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

   ObjectCreate("EURUSD", OBJ_LABEL, 0, 0, 0);  // Creating obj.
   ObjectSet("EURUSD", OBJPROP_CORNER, 0);    // Reference corner
   ObjectSet("EURUSD", OBJPROP_XDISTANCE, Column1x*ZoomTimes);// X coordinate   
   ObjectSet("EURUSD", OBJPROP_YDISTANCE, ZoomTimes*15);// Y coordinate
 
tonny:

Что вызывает ошибку переполнения стека в mql4? Я подозреваю использование функции для создания объектов. Ниже приведена функция, которая была вызвана более сотни раз для создания объектов.

Ниже приведен один пример использования.

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

У меня никогда не было переполнения стека, из того, что я читал, они часто вызваны рекурсией, но я не вижу этого в коде, который вы опубликовали ... почему тип вашей функции int? какой смысл передавать переменную double zoom, если вы ее не используете?

И еще одно, значения для OBJPROP_XDISTANCE и OBJPROP_YDISTANCE должны быть int, а не double.
 
RaptorUK:
У меня никогда не было переполнения стека, из того, что я читал, они часто вызваны рекурсией, но я не вижу этого в коде, который вы опубликовали... почему тип вашей функции int? какой смысл передавать переменную double zoom, если вы ее не используете?

И еще одно, значения для OBJPROP_XDISTANCE и OBJPROP_YDISTANCE должны быть int, а не double.


Вот это меня и озадачивает.

RaptorUK:
У меня никогда не было переполнения стека, из того, что я читал, они часто вызваны рекурсией, но я не вижу этого в коде, который вы опубликовали ... почему тип вашей функции int? какой смысл передавать переменную double zoom, если вы ее не используете?

И еще одно, значения для OBJPROP_XDISTANCE и OBJPROP_YDISTANCE должны быть int, а не double.

Я сделал несколько операций по поиску и замене и пока не смог исправить нижнюю часть индикатора.

RaptorUK:
У меня никогда не было переполнения стека, из того, что я читал, они часто вызваны рекурсией, но я не вижу этого в коде, который вы опубликовали ... почему тип вашей функции int? какой смысл передавать переменную double zoom, если вы ее не используете?

И еще одно, значения для OBJPROP_XDISTANCE и OBJPROP_YDISTANCE должны быть int, а не double.

Человек, пожалуйста, прочитайте больше книг по ObjectSet(). Подождите, позвольте мне помочь. Ниже приведен отрывок.

bool ObjectSet( string name, int index, double value)
 
tonny:


Человек, пожалуйста, прочитайте больше книг по ObjectSet(). Подождите, позвольте мне помочь. Ниже приведен отрывок.

Я посмотрю вашу цитату и подниму вам это ...

OBJPROP_XDISTANCE102intЦелочисленное значение для установки/получения свойства объекта "Расстояние якоря X" в пикселях.
OBJPROP_YDISTANCE103intЦелочисленное значение для установки/получения свойства объекта расстояния до якоря Y в пикселях.

Вы бы использовали для этого двойное значение?

OBJPROP_BACK9boolБулево значение для установки/получения флага фонового рисунка для объекта.
OBJPROP_RAY10boolБулево значение для установки/получения флага луча для объекта.
OBJPROP_ELLIPSE11boolБулево значение для установки/получения флага эллипса для дуг fibo.


 
tonny: Я действительно запутался в том, что вы ожидали. Я никогда не получал ошибку " переполнениестека " во время компиляции. Не могли бы вы дать нам точные указания, как мы должны воспроизвести проблему?
 
Ovo:
tonny: Я действительно запутался в том, что вы ожидали. Я тоже никогда не получал ошибку "переполнения стека" во время компиляции. Не могли бы вы дать нам точные указания, как мы должны воспроизвести проблему?
Как вы пытались ее воспроизвести? Выше приведена только часть кода, я же ясно сказал, что вызывал функцию более сотни раз, так что если вы хотите воспроизвести ее, вы можете смоделировать 108 вызовов функции.
 
RaptorUK:

Я посмотрю вашу цитату и подниму вас с этим ...

Вы бы использовали двойника для этого?

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

Хорошо.
 

Я провел эксперимент и заменил некоторые из таких объектов.

ObjectCreate("EURUSD", OBJ_LABEL, 0, 0, 0);  // Creating obj.
   ObjectSet("EURUSD", OBJPROP_CORNER, 0);    // Reference corner
   ObjectSet("EURUSD", OBJPROP_XDISTANCE, Column1x*ZoomTimes);// X coordinate   
   ObjectSet("EURUSD", OBJPROP_YDISTANCE, ZoomTimes*15);// Y coordinate

и использовал стиль функции, как показано ниже, и ошибка исчезла. Это похоже на то, что IDE может принять меньше вышеперечисленных объектов, чем нижеперечисленных. Попробуйте заменить все вышеперечисленные стили на нижеприведенные и посмотрите, может ли появиться что-то еще.

ObCreate("EURUSD",Column1x,15,ZoomTimes);
 
Я приложил сюда скрипт, который выдает ошибку, и нейтрализованную версию, которая ее не выдает. Возможно, кто-то сможет найти другое решение. Блин это большой баг.
Файлы: