MetaTrader 4 Client Terminal build 604 - страница 32

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

Здесь Артём прав: во-первых, не пишите глупости - не будет предупреждений; во-вторых, не всё можно взять нахрапом. :)
 

Похоже, обнаружился глюк компилятора. Начал писать класс по хранению ордеров и нате.. Если вставляю enum OrderType перед вызовом AddOrder, все ок. Если вставляю после, как сейчас в коде, компилятор этот enum не видит и ругается

'OrderType' - declaration without type OrderManager.mqh 24 18
'ordType' - comma expected OrderManager.mqh 24 28

class COrderManager
{
private:
    CList ListMarketOrders;
    CList ListPendingOrders;
    CList ListHistOrders;
public:
//    enum OrderType {History, Pending, Market};  // так все компилируется без ошибок
    COrderManager();
    ~COrderManager();
    int AddOrder(OrderType ordType, int ticket, string symbol, int cmd, double volume, double price, int slippage=0, double stoploss=0, 
        double takeprofit=0, string comment=NULL, datetime expiration=0);
    enum OrderType {History, Pending, Market};  // вызывает ошибку компиляции
    bool DeleteOrder(int ticket);  
};
 
VDev:

Похоже, обнаружился глюк компилятора. Начал писать класс по хранению ордеров и нате.. Если вставляю enum OrderType перед вызовом AddOrder, все ок. Если вставляю после, как сейчас в коде, компилятор этот enum не видит и ругается

'OrderType' - declaration without type OrderManager.mqh 24 18
'ordType' - comma expected OrderManager.mqh 24 28


А ничего, что имя OrderType зарезервировано под одноименную торговую функцию?
 
Andrei01:
ну а все же интересно что вы скажете если вдруг будет решено убрать в редакторе излишние и надоедливые предупреждения.


Я понимаю, вопрос не ко мне, но я буду за. С другой стороны, разработчики уже внедрили по полной этот сервис предупреждений. Зачем убирать, если это уже есть и работает? Но ДОБАВЬТЕ возможность отключать. Для кого вообще эта чать МТ сделана? Или новички будут учиться по варнингам программы писать? Не самое хорошее занятие. Традиционно лучше с мат.части начинать. А традиционно человек, который открыл первые фигурные скобки навсегда узнает о "зоне видимости". Но в последнее время я заметил другую штуку. Сначала такое количество варнигов раздражало, а теперь глаз потихоньку перестает их замечать. Видимо, защитная реакция организма. А вот это уже плохо. Потому что среди бестолковых варнингов есть толковые, например, я где-то чисто забыл привести типы. И ещё мне не понятна необходимость англоязычности сообщений. Странно получается, англоязычные пацаны сделали Студию, но там все сообщения компилятора по-русски. А русскоязычные сделали - по аглицки.
 

Обновился на 605 билд. Скрипт начал завершаться с "out of range" на один из массивов. Правда, это массив структур, но всё равно ничего криминального в нем нет. Размерность массива 10 тысяч, максимум в него пишется несколько сотен значений. В 600 работало, в 604 работало, в 605 в режиме отладки работает. А при обычном запуске скрипта "out of range". А после нескольких запусков вообще вывалилось: 2014.02.13 07:36:21.407 Access violation read to 0xCF8A03AF in 'E:\Program Files\MT4 Beta\MQL4\Scripts\s_StrategyTester.ex4'

Щас вернул взад 604, всё работает.

Вынь7х64.

 
evillive:

А ничего, что имя OrderType зарезервировано под одноименную торговую функцию?
Во я тормознул))) Заработался вчера совсем))
 
VDev:

Похоже, обнаружился глюк компилятора. Начал писать класс по хранению ордеров и нате.. Если вставляю enum OrderType перед вызовом AddOrder, все ок. Если вставляю после, как сейчас в коде, компилятор этот enum не видит и ругается

Типы компилятор распознаёт последовательно по ходу трансляции.

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

Это касается не только enum'ов, но также объявлений классов и структур. Такова особенность языка. Просто запомните и учитывайте при разработке.

Успехов.

 
evillive:

А ничего, что имя OrderType зарезервировано под одноименную торговую функцию?

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

т.е. ситуация как с глобальными/локальными переменными.

Аналогично (для примера) я могу объявить локальную переменную с именем, совпадающим с именем библиотечной функции. Это будет скомпилировано и будет работать:

int OnInit()
  {
//--- create timer
   int OrderType = 500;
   EventSetMillisecondTimer(OrderType);
      
//---
   return(INIT_SUCCEEDED);
  }
 
Alexey_74:

Я понимаю, вопрос не ко мне, но я буду за. С другой стороны, разработчики уже внедрили по полной этот сервис предупреждений. Зачем убирать, если это уже есть и работает? Но ДОБАВЬТЕ возможность отключать. Для кого вообще эта чать МТ сделана? Или новички будут учиться по варнингам программы писать? Не самое хорошее занятие. Традиционно лучше с мат.части начинать. А традиционно человек, который открыл первые фигурные скобки навсегда узнает о "зоне видимости". Но в последнее время я заметил другую штуку. Сначала такое количество варнигов раздражало, а теперь глаз потихоньку перестает их замечать. Видимо, защитная реакция организма. А вот это уже плохо. Потому что среди бестолковых варнингов есть толковые, например, я где-то чисто забыл привести типы. И ещё мне не понятна необходимость англоязычности сообщений. Странно получается, англоязычные пацаны сделали Студию, но там все сообщения компилятора по-русски. А русскоязычные сделали - по аглицки.
ИМХО варнинги убирать не надо. Надо их в коде убирать, т.к. часто варнинг говорит о скрытой ловушке, которая когда-нибудь да сработает. Насчет студии - там много локализаций, но за студией стоит могучий коллектив программистов MS. Лет шесть или больше тому назад, когда MS впервые выдала русскую версию, народ ржал, типа кому это нужно, программист должен знать технический английский. Но маркетинговый ход оказался верным. Вот перевод MSDN на русский я одобряю, не у всех есть навыки быстрого чтения, но переводить интерфейс и типовые сообщения...
 
MetaDriver:

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

т.е. ситуация как с глобальными/локальными переменными.


В принципе, в С++ это так, но на MQL документированного стандарта нет, так что можно только гадать. Лучше конечно не перекрывать системные функции. И вопрос - почему от перестановки строки с объявлением этого enum возникает/пропадает ошибка компилятора?

Ведь глюк по любому?

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