Скачать MetaTrader 5

Ошибка -1008. Нельзя заранее объявлять классы, если потом не объявляешь их окончательно.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Проси своего брокера открыть официальный канал. Новости прочитают тысячи трейдеров!
George Merts
3609
George Merts 2012.10.18 08:57 

Упростил уже до безобразия, и отловил интересную ситуацию.

Имеем два файла.

Файл самого будущего советника, в нем один #include и одна функция Инит, возвращающая нуль:

#include "MyData.mqh"

int OnInit()
  {
  return(0);
  }

   

Файл MyData тоже очень простой:

// class CFoo;              // ОБРАЩАЕМ ВНИМАНИЕ НА ЭТУ ПОКА ЗАКОММЕНТАРЕННУЮ ДЕКЛАРАЦИЮ.

class CAdvisorData

{
public:

double               m_dFirstData;

double               m_dSecondData;
};


Все замечательно компилируется и запускается.

Но как только во втором файле раскомментариваем форвардную декларацию класса - все по-прежнему прекрасно компилируется, но при попчтке запуска вылетает сообщение "internal error #-1008, EX5 write error".

Какие мысли, где я допустил ляпсус ?

Вроде как форвардная декларация не должна ничего менять...   

o_o
Модератор
23693
o_o 2012.10.18 09:05  

а если упростить еще больше - перенести все в один файл к OnInit и убрать поля double

George Merts
3609
George Merts 2012.10.18 09:08  
sergeev:

а если упростить еще больше - перенести все в один класс и убрать поля double

Не вполне понял, что переносить в один класс. Закомментаренную декларацию ?

И поля дубль - если убрать, то оставить пустой класс CAdvisorData ? 

o_o
Модератор
23693
o_o 2012.10.18 09:12  
Laryx:

Не вполне понял, что переносить в один класс. Закомментаренную декларацию ?

И поля дубль - если убрать, то оставить пустой класс CAdvisorData ? 

не класс, а файл
George Merts
3609
George Merts 2012.10.18 09:16  

sergeev:
не класс, а файл 

Тоже самое получается. 

 

 А ! Разобрался.   

Форвардная декларация класса требует обязательного последующего объявления такого класса, даже если этот класс нигде не используется. (В реальном коде я его объявил просто на будущее, пока еще нигде не использую). Как только  класс СFoo был описан в конце файла - тут же ошибка исчезла. 

  

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

Наверно надо в сервисдеск послать, чтобы ошибка вылетала более осмысленная, типа "отсутствие класса, описанного в форвардной декларации". 

....

Написал предложение в Сервисдеск. 

Ilyas
1206
Ilyas 2012.10.18 10:12  

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