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

 

Понадобилось определять размер массива переменной, но выходит ошибка:

void OnStart()
  {
   int j=1000;
//---
   double arrBalancesTS[][j];
  }

//---

//---

С константами (#define) и с числовым значением напрямую работает, а так нет. Почему?

 
tol64:

Понадобилось определять размер массива переменной, но выходит ошибка:

//---

//---

С константами (#define) и с числовым значением напрямую работает, а так нет. Почему?

с константами - статический массив, а с переменной - динамический.  А размер динамического определяется с помощью ArrayResize
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

Почему?

Вторая и последующие размерности имеют фиксированный размер. Задавать его можно только константой.
 
tol64:

С константами (#define) и с числовым значением напрямую работает, а так нет. Почему?

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

void OnStart()
  {
//---
   double arrBalancesTS[][1000];
  }

что не противоречит языку MQL5.

 
Yedelkin:

ОК. Тогда я возьму на себя наглость. Итак, в описании функции Print() сказано, что "Данные типа double выводятся с точностью до 16 десятичных цифр после точки". На самом деле оказалось, что функция Print() выводит несколько округлённые данные:

 

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.9999999999999716

 

Дело в том, что вещественное число хранится в памяти с не более чем 17 значащих цифр.

Попробуйте такой пример, чтобы почувствовать разницу:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));

   Print("Print(StringFormat(b,%.15G))=",StringFormat("%.15G",b));
   Print("Print(StringFormat(b,%.16G))=",StringFormat("%.16G",b));
   Print("Print(StringFormat(b,%.17G))=",StringFormat("%.17G",b));
   Print("Print(StringFormat(b,%.18G))=",StringFormat("%.18G",b));
   
//19999999999999997
   Print("Print(StringFormat(b,%.15f))=",StringFormat("%.15f",b));
   Print("Print(StringFormat(b,%.16f))=",StringFormat("%.16f",b));
   Print("Print(StringFormat(b,%.17f))=",StringFormat("%.17f",b));
   
  }
//+------------------------------------------------------------------+
Описание в справке поправим.
 
notused:
с константами - статический массив, а с переменной - динамический.  А размер динамического определяется с помощью ArrayResize
TheXpert:
Вторая и последующие размерности имеют фиксированный размер. Задавать его можно только константой.
Rosh:

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

что не противоречит языку MQL5.

Спасибо. Подскажите, а что можно сделать, если размер массива и в первом и втором измерении определяется при вычислениях и не может быть константой? С помощью ArrayResize() ведь можно изменить размер только первого измерения. И почему изменить размер массива можно применяя значение переменной, а изначально установить нельзя?
 
tol64:
Спасибо. Подскажите, а что можно сделать, если размер массива и в первом и втором измерении определяется при вычислениях и не может быть константой? С помощью ArrayResize() ведь можно изменить размер только первого измерения. И почему изменить размер массива можно применяя значение переменной, а изначально установить нельзя?
пользуйтесь классами.
 
tol64:
Спасибо. Подскажите, а что можно сделать, если размер массива и в первом и втором измерении определяется при вычислениях и не может быть константой? С помощью ArrayResize() ведь можно изменить размер только первого измерения. И почему изменить размер массива можно применяя значение переменной, а изначально установить нельзя?
Посмотрите в разделе Перегрузка операций пример для класса CMatrix, возможно, это Вам это поодойдет.
 
Здравствуйте.

Что-то не могу найти как заставить 2 класса обмениваться сообщениями.

Хотелось быть что бы в классе А имелась ссылка на B, а в B на А.
У меня ошибка при компиляции, возможно в MQL5 такое не разрешается. Но без этого обьектное програмирование используется на 30%.

Решением возможно было бы написать один большой GOD Class,который все знает и все умеет. Но это мне не кажется очень элегантным..
Кто сможет помочь с решением?

Заранее спасибо!
Причина обращения: