Скачать MetaTrader 5

Товарищи помогите плиз найти ошибку

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Знаете ли вы, что в MQL5 появились структуры?
Forex Trader
114255
Forex Trader 2007.02.18 17:34 
Дано :
Date[10] - массив дат важных событий, объявленный в Start{}
Функция сканирует не находимся ли мы неподалеку от одного из них, если да,
то выдает OpeningSignal()=True

Проблема :
при компиляции возникает ошибка wrong parameters count

bool OpeningSignal(int Date[10])
{
bool OpenSignal;
int cnt;
OpenSignal=False;
   for (cnt=1; cnt<=10; cnt++)
         {
         if (Date[cnt]-TimeLocal()<=OpenTimeRange*60 && Date[cnt]-TimeLocal()>-3*60)
            {OpenSignal=True; break;}
         else 
            {OpenSignal=False; continue;}
         }
 return(OpenSignal); 
}




Объясните пожалуйста в чем дело ;)

Forex Trader
114255
Forex Trader 2007.02.18 18:44  
вызывает подозрение массив в параметрах функции, назнаю можно ли такое в этом языке, попробуй вызывать функцию OpeningSignal в цикле по массиву Date[10]
Forex Trader
114255
Forex Trader 2007.02.18 18:47  
wrong parameters count означает, что задано неверное число параметров при вызове функции.
Видимо вы вместо массива из 10 элементов при вызове функции передаёте массив из другого количества элементов. Приведите место, где вы вызываете эту функцию в своей программе, из которого было бы понятно какое количество элементов в этом массиве на самом деле.
У меня всё прекрасно компилится без ошибок.
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int OpenTimeRange=10;
int ddd[10];
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   OpeningSignal(ddd);
//----
   return(0);
  }
//+------------------------------------------------------------------+
bool OpeningSignal(int Date[10])
{
bool OpenSignal;
int cnt;
OpenSignal=False;
   for (cnt=1; cnt<=10; cnt++)
         {
         if (Date[cnt]-TimeLocal()<=OpenTimeRange*60 && Date[cnt]-TimeLocal()>-3*60)
            {OpenSignal=True; break;}
         else 
            {OpenSignal=False; continue;}
         }
 return(OpenSignal); 
}
Forex Trader
114255
Forex Trader 2007.02.18 18:52  
Ошибка в объявлении функции. Массив можно передавать только по ссылке. Это делается так:
bool OpeningSignal(int& Date[])
Forex Trader
114255
Forex Trader 2007.02.18 19:22  
Ошибка в объявлении функции. Массив можно передавать только по ссылке. Это делается так:
bool OpeningSignal(int& Date[])



Если это так, то почему приведённый мною выше пример не выдаёт ошибку при компиляции?
Мне кажется, что массивы можно передавать и без ссылок, если не требуется получить обратно изменённые данные массива.
Forex Trader
114255
Forex Trader 2007.02.18 19:40  
Мне кажется, что массивы можно передавать и без ссылок, если не требуется получить обратно изменённые данные массива.

Да, Вы правы. Я проверил вот этим скриптом:
#property show_inputs

void start() {
  int a[5]={1,2,3,4,5};
  Print("Вывод массива из start()");
  for (int i=0; i<6; i++) Print("a[",i,"]=",a[i]);

  func1(a);
  func2(a);
}
void func1(int a[2]) {
  Print("Вывод массива из func1()");
  for (int i=0; i<7; i++) Print("a[",i,"]=",a[i]);
}
void func2(int& a[3]) {
  Print("Вывод массива из func2()");
  for (int i=0; i<8; i++) Print("a[",i,"]=",a[i]);
}



Дополнительно хочу обратить внимание, что в объявлении функции бесполезно указывать размерность массива. Поэтому правильнее и экономичнее на несколько символов будет определять так:

void func1(int a[]) {...}
void func2(int& a[]) {...}
Forex Trader
114255
Forex Trader 2007.02.18 19:41  
Solandr спасибо большое, не знал что при вызове функции нельзя упоминать размерность массива
Forex Trader
114255
Forex Trader 2007.02.18 20:09  
Вероятно что когда передаешь параметр типа Array[10] функция передает десятый элемент массива а не массив из 10 элементов?
Forex Trader
114255
Forex Trader 2007.02.19 20:32  
А не потому, что в массиве из десяти значений первое - 0, а последнее - 9?
Тогда выражение
for (cnt=1; cnt<=10; cnt++) будет глючить.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий