Я использую элементы массивов в качестве параметров функций и процедур.
Обращение к процедуре (переменные и массивы объявлены как и выше):
Обращение к процедуре (переменные и массивы объявлены как и выше):
В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;
Приходилось и мне с этим сталкиваться.
Очевидный воркараунд
Очевидный воркараунд
Этот вариант, конечно же, приходил мне на ум. Но я обошел эти сложности проще.
Дело, однако, не в том, как обойти. Наш человек всегда вывернется.
Хочется от разработчиков услышать, как оно на самом деле.
Если элемент массива нельзя передавать по имени в скалярный параметр, то пусть так и скажут.
Опять же:
void f(int arr[4]) { }
Так компилируется:
int arr[4]; f(arr);
А так - нет:
int arr[10][4]; f(arr[0]);
То же справедливо и для встроенных функций МТ. Стандартная сишная конструкция
Вообще, в документации фигурирует некий тип object, которому нигде не дано никакого определения:
Что, интересно, он из себя представляет, конкретно?
int array[7][40];
int arrayLength = ArraySize(array) / ArraySize(array[0]);
не компилируется.int arrayLength = ArraySize(array) / ArraySize(array[0]);
Вообще, в документации фигурирует некий тип object, которому нигде не дано никакого определения:
int ArraySize( object array[])
Возвращает количество элементов массива. Для одномерного массива значение, возвращаемое функцией ArraySize, равно значению ArrayRange(array,0).
Параметры:
array[] - Массив любого типа.
Возвращает количество элементов массива. Для одномерного массива значение, возвращаемое функцией ArraySize, равно значению ArrayRange(array,0).
Параметры:
array[] - Массив любого типа.
Что, интересно, он из себя представляет, конкретно?
ArraySize(array) - это не sizeof(), а чистая функция определения размера массива.
Поэтому ArraySize(array) - верно, а ArraySize(array[0]) - нет.
Поэтому ArraySize(array) - верно, а ArraySize(array[0]) - нет.
ArraySize(array) - это не sizeof(), а чистая функция определения размера массива.
Поэтому ArraySize(array) - верно, а ArraySize(array[0]) - нет.
Об отличиях между ArraySize и sizeof я догадываюсь. Остается непонятным только, почему ArraySize(array[0]) неверно. Разве array[0] не одномерный массив из 40 элементов? Почему его размер не удается чисто определить? :)Поэтому ArraySize(array) - верно, а ArraySize(array[0]) - нет.
В документации этого нет. Нужно просто уточнение, какие ограничения есть у многомерных массивов mql в отличие от таковых в си - "MQL4: Синтаксис"
Синтаксис языка программирования торговых стратегий MQL4 синтаксически очень похож язык программирования Си, за исключением некоторых возможностей:
*
отстутствует адресная арифметика;
*
отсутствует оператор do ... while;
*
отсутствует оператор goto ...;
*
отсутствует операция [условие]?[выражение 1]:[выражение 2];
*
отсутствуют сложные типы данных (структуры);
*
невозможны сложные присваивания. Например, val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; и т.п.;
*
вычисление логического выражения производится до конца и не прерывается досрочно.
*
отстутствует адресная арифметика;
*
отсутствует оператор do ... while;
*
отсутствует оператор goto ...;
*
отсутствует операция [условие]?[выражение 1]:[выражение 2];
*
отсутствуют сложные типы данных (структуры);
*
невозможны сложные присваивания. Например, val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; и т.п.;
*
вычисление логического выражения производится до конца и не прерывается досрочно.
В описании работы с массивами тоже ничего про то, что ArraySize(array[0]) неверно, нет.
Кроме того, хотелось бы все-таки узнать про тип object, возможности и ограничения его использования.
Во всяком случае, этот недокументированный тип данных присутствует в ArraySize.
Под object имелся в виду исключительно "объект типа массив".
Под object имелся в виду исключительно "объект типа массив".
Тогда ArraySize(array[0]) должен был бы компилироваться. Разве array[7][40] это не "объект типа массив", представляющий из себя вектор из 7 "объектов типа массив", каждый из которых, в свою очередь, содержит 40 элементов базового типа?
У нас - нет.
У нас - нет.
Это понятно. Я, собственно, призываю озвучить это отличие в документации, чтобы снять вопрос навсегда.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
При передаче элементов массивов в качестве параметров по значению проблем нет.
Объявление процедуры:
Обращение к процедуре:
Такая конструкция работает, как это и должно быть.
А вот при передаче элементов массивов в качестве параметров по имени возникают проблемы.
Объявление процедуры:
Обращение к процедуре (переменные и массивы объявлены как и выше):
Компилятор, в строке вызова процедуры, находит ошибку несоответствия типов.
Возможно воспринимает АА[nn] и ВВ[nn] как массивы, а не как переменные,
которыми являются элементы массивов.
Вопрос. Можно ли элементы массивов передавать в процедуру по имени ?
Если да, то в чем проблема ? Если нет, то что можно передавать по имени
и как быть с элементами массивов ?