Скачать MetaTrader 5

Передача параметров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен торговый робот? Закажи его в сервисе Фриланс!
Forex Trader
114255
Forex Trader 2006.08.07 12:49 
Я использую элементы массивов в качестве параметров функций и процедур.
При передаче элементов массивов в качестве параметров по значению проблем нет.
Объявление процедуры:
 void AProc(int nn, int mm, double aa, int  bb)


Обращение к процедуре:

 
int nn,mm,BB[9];
double AA[9];
.........................................
AProc(nn,mm,AA[nn],BB[nn]);


Такая конструкция работает, как это и должно быть.
А вот при передаче элементов массивов в качестве параметров по имени возникают проблемы.
Объявление процедуры:

 void BProc(int nn, int mm, double& aa, int&  bb)


Обращение к процедуре (переменные и массивы объявлены как и выше):

 ВProc(nn,mm,AA[nn],BB[nn]);


Компилятор, в строке вызова процедуры, находит ошибку несоответствия типов.
Возможно воспринимает АА[nn] и ВВ[nn] как массивы, а не как переменные,
которыми являются элементы массивов.

Вопрос. Можно ли элементы массивов передавать в процедуру по имени ?
Если да, то в чем проблема ? Если нет, то что можно передавать по имени
и как быть с элементами массивов ?



Forex Trader
114255
Forex Trader 2006.08.07 14:04  
Я использую элементы массивов в качестве параметров функций и процедур.

Обращение к процедуре (переменные и массивы объявлены как и выше):
 ВProc(nn,mm,AA[nn],BB[nn]);


Компилятор, в строке вызова процедуры, находит ошибку несоответствия типов.
Возможно воспринимает АА[nn] и ВВ[nn] как массивы, а не как переменные,
которыми являются элементы массивов.

Вопрос. Можно ли элементы массивов передавать в процедуру по имени ?
Если да, то в чем проблема ? Если нет, то что можно передавать по имени
и как быть с элементами массивов ?


Приходилось и мне с этим сталкиваться.
Очевидный воркараунд
double a, b;
a = AA[nn];
b = BB[nn];
BProc(nn, mm, a, b);
AA[nn] = a;
BB[nn] = b;
Forex Trader
114255
Forex Trader 2006.08.07 15:53  
Приходилось и мне с этим сталкиваться.
Очевидный воркараунд

Этот вариант, конечно же, приходил мне на ум. Но я обошел эти сложности проще.
Дело, однако, не в том, как обойти. Наш человек всегда вывернется.

Хочется от разработчиков услышать, как оно на самом деле.
Если элемент массива нельзя передавать по имени в скалярный параметр, то пусть так и скажут.
Forex Trader
114255
Forex Trader 2006.08.09 01:07  
Опять же:

void f(int arr[4]) {
}



Так компилируется:

int arr[4];
f(arr);



А так - нет:

int arr[10][4];
f(arr[0]);


Forex Trader
114255
Forex Trader 2006.08.09 03:20  
То же справедливо и для встроенных функций МТ. Стандартная сишная конструкция
int array[7][40];
int arrayLength = ArraySize(array) / ArraySize(array[0]);
не компилируется.

Вообще, в документации фигурирует некий тип object, которому нигде не дано никакого определения:
int ArraySize( object array[])
Возвращает количество элементов массива. Для одномерного массива значение, возвращаемое функцией ArraySize, равно значению ArrayRange(array,0).
Параметры:
array[] - Массив любого типа.


Что, интересно, он из себя представляет, конкретно?
MetaQuotes Software Corp.
Модератор
181168
MetaQuotes Software Corp. 2006.08.09 09:25  
ArraySize(array) - это не sizeof(), а чистая функция определения размера массива.
Поэтому ArraySize(array) - верно, а ArraySize(array[0]) - нет.
Forex Trader
114255
Forex Trader 2006.08.09 13:55  
ArraySize(array) - это не sizeof(), а чистая функция определения размера массива.
Поэтому ArraySize(array) - верно, а ArraySize(array[0]) - нет.
Об отличиях между ArraySize и sizeof я догадываюсь. Остается непонятным только, почему ArraySize(array[0]) неверно. Разве array[0] не одномерный массив из 40 элементов? Почему его размер не удается чисто определить? :)

В документации этого нет. Нужно просто уточнение, какие ограничения есть у многомерных массивов mql в отличие от таковых в си - "MQL4: Синтаксис"
Синтаксис языка программирования торговых стратегий MQL4 синтаксически очень похож язык программирования Си, за исключением некоторых возможностей:

*

отстутствует адресная арифметика;
*

отсутствует оператор do ... while;
*

отсутствует оператор goto ...;
*

отсутствует операция [условие]?[выражение 1]:[выражение 2];
*

отсутствуют сложные типы данных (структуры);
*

невозможны сложные присваивания. Например, val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; и т.п.;
*

вычисление логического выражения производится до конца и не прерывается досрочно.

В описании работы с массивами тоже ничего про то, что ArraySize(array[0]) неверно, нет.

Кроме того, хотелось бы все-таки узнать про тип object, возможности и ограничения его использования.

Во всяком случае, этот недокументированный тип данных присутствует в ArraySize.
MetaQuotes Software Corp.
Модератор
181168
MetaQuotes Software Corp. 2006.08.09 15:27  
Под object имелся в виду исключительно "объект типа массив".
Forex Trader
114255
Forex Trader 2006.08.09 16:44  
Под object имелся в виду исключительно "объект типа массив".

Тогда ArraySize(array[0]) должен был бы компилироваться. Разве array[7][40] это не "объект типа массив", представляющий из себя вектор из 7 "объектов типа массив", каждый из которых, в свою очередь, содержит 40 элементов базового типа?
MetaQuotes Software Corp.
Модератор
181168
MetaQuotes Software Corp. 2006.08.09 16:48  
Под object имелся в виду исключительно "объект типа массив".

Тогда ArraySize(array[0]) должен был бы компилироваться. Разве array[7][40] это не "объект типа массив", представляющий из себя вектор из 7 "объектов типа массив", каждый из которых, в свою очередь, содержит 40 элементов базового типа?

У нас - нет.
Forex Trader
114255
Forex Trader 2006.08.09 18:23  

У нас - нет.

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