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

 
speedy:

Кнопка Compile теряется навсегда (нужно перезагружать редактор чтобы вернуть)

Ну не совсем.. :)  Мне удалось вернуть :)

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

 
speedy:

1.  "Выдавать" внутренние не базовые элементы класса в наружу (а в данном примере не сам атрибут, а только элемент массива !) тем более с возможностью изменить его значение - не безопасно.

2.  К тому же это противоречит "духу" обьектного ориентированного програмирования: всю работу с данными обьекта нужно стараться выполнять внутри обьекта, его же методами..

3.  А как насчет того чтобы просто использовать Setter для аттрибута data ?

4.  Код только выиграет по читабельности.

5.  В конечном итоге эта "простота" с l-value индексатором сделает так что никто включая вас не будет понимать как этот код работает..

6.  Потратите больше времени на поиск ошибок чем на написание Setter.

Это что, юмор такой чёрный?

1.  Извини, - бред.  Я понимаю, тут паранойя в моде, и является ломовым аргументом за "почему так не надо делать".  Никакой опасности не вижу в упор. Смотрел внимательно, если чё.  Любое имя, в конечном счёте есть ссылка.  Индексация есть обычное расширение понятия имени. Не более.  Давай запретим присваивание вообще.  В целях безопасности.  Ссылки же крайне опасны так?

2.  Духу объектно-ориентированного программирования, при такой логике, яростно противоречат С++, С#, Делфи, пара дюжин менее популярных языков, в которых индексаторы совершенно нормально работают и справа и слева.  Причём здравому смыслу и моему духу это почему-то не противоречит.

Индексаторы делаются для связи с внешней средой.  Их функция именно интерфейсная.  Я могу инкапсулировать и прятать что угодно, но индексы мне нужны для оперирования объектами как массивами. Фактически все массивы как-то устроены. Например обычные динамические массивы mql. Может запретим их слева от оператора присваивания ставить?  Заменим функцией какой-нибудь типа SetArrayValue(array, i, j, value);  Заодно и в читабельности выиграем. Да и отладка станет куда проще.  Мля. Уф..

3.  А как насчёт того, чтоб сделать нормальный индексатор?  Горничная это конечно классно, но королева всё-таки лучше.

4.  Вот в этом месте у меня крыша конкретно начала ехать.  Это что, нечитабельно??

  t[i]=i*i;

Вот это читабельнее, да?

  t.setDataElement(i, i*i);

Круто.  Пожалуй пойду лечиться.

5.  Ваще круто.

6. Я плакаль.


 

На 630 билде перестал компилироваться индикатор:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
 //код
 for(int i=limit; i<rates_total && !IsStopped(); i++)
  {
   if()
    {
     //~400 стр. кода
     // i используется много раз
     // тут же определяется RT=true или false
    }
   if(RT)
    {
     double p=close[i];  // 'i' - undeclared identifier
    }
  }
 return(rates_total);  // 'rates_total' - undeclared identifier
}

 ошибку c i можно убрать если объявление вынести перед for

int i;
for(i=limit; i<rates_total && !IsStopped(); i++)
{

}

 А что делать с 'rates_total' - undeclared identifier ?

 Одинаково на Win7 x64 и XP x32.

 

Подскажите, пожалуйста. MathMin() и MathMax() реализованы как функции (с передачей параметров через стек) или макроподстановкой (inline)? Судя по справочнику это - функции.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
kPVT:

На 630 билде перестал компилироваться индикатор:

 ошибку c i можно убрать если объявление вынести перед for

 А что делать с 'rates_total' - undeclared identifier ?

 Одинаково на Win7 x64 и XP x32.

У Вас явно где-то ошибка в коде. Предъявленный блок компилируется без ошибок, если объявить переменные limit, RT и задать условие if()
 
Rosh:
У Вас явно где-то ошибка в коде. Предъявленный блок компилируется без ошибок, если объявить переменные limit, RT и задать условие if()

Естественно, ведь я привел не код, а его примерную структуру.

На 619 билде индикатор компилировался и отлично работал.

На 630 выдает указанные ошибки. 

Код 100% не изменялся. Явно изменилась работа компилятора. 

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

Баг?

Код приведенный ниже генерирует что-то типа вечного цикла в компиляторе. Нажатие на Cancel (отмена компиляции)

срабатывает не сразу, а когда стабатывает, возвращает контроль над редактором.

При этом сама кнопка Cancel  не исчезает, но и не остается доступной.. 

Кнопка Compile теряется навсегда (нужно перезагружать редактор чтобы вернуть)

Спасибо за сообщение, ошибка компилятора исправлена.
 
victorg:

Подскажите, пожалуйста. MathMin() и MathMax() реализованы как функции (с передачей параметров через стек) или макроподстановкой (inline)? Судя по справочнику это - функции.

Конечно функции, ведь в момент компиляции неизвестны значения аргументов. ИМХО inline и макроподстановки вещи разные.

P.S: inline они или не inline сказать не могу. 

 
220Volt:

Конечно функции, ведь в момент компиляции неизвестны значения аргументов. ИМХО inline и макроподстановки вещи разные.

P.S: inline они или не inline сказать не могу. 

Макрос и инлайн функция действительно вещи разные. Но я не об этом. Вот пример когда в момент компиляции значения аргументов неизвестны

#define  min(a,b) (((a)<(b))?(a):(b))
double func(a,b)
  {
  c=min(a,b);   // 1-й вариант
  c=fmin(a,b);  // 2-й вариант
  return(c);
  }

В первом случае должна происходить вставка кода в текущую функцию (наверное), а во втором вызов функции с передачей параметров через стек (наверное). Но в целях оптимизации компилятор может и второй вариант реально реализовывать подстановкой. Так ли это? Я не знаю. Поэтому и спросил.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
Причина обращения: