Как можно передать двумерный массив в функцию таким образом чтобы не указывать что он двумерный? - страница 2

 
Alexey Viktorov:

Именно в этом и есть смысл.

Как вы понимаете "функцию сдвига массивов"? Хочу уточнит, чтобы небыло разного понимания.

Я чуть выше написал как выглядит функция.

 
Seric29:

Я чуть выше написал как выглядит функция.

Так не честно. Вы хотите чтобы я сам догадывался что у вас в голове?

Ну попробую: Хотите сдвинуть все элементы массива на одну строку "вверх" или "вниз"?

 
Alexey Viktorov:

Так не честно. Вы хотите чтобы я сам догадывался что у вас в голове?

Ну попробую: Хотите сдвинуть все элементы массива на одну строку "вверх" или "вниз"?

Если плюс то это удаление тянет на себя, по ходу это вниз, там стоит цифра 8

   for(int cn=0; cn<=8; cn++)
     {                
      a[cn]=a[cn+1];
     }

что говорит о том что элементов 10, последний обрабатываемый элемент 9ый(a[8]=a[8+1];). В принципе не суть проблема в том чтобы функция могла принять как одномерный так и двумерный массив. А куда оно будет двигать не имеет значения. 

 
Seric29:

Если плюс то это удаление тянет на себя, по ходу это вниз, там стоит цифра 8

что говорит о том что элементов 10, последний обрабатываемый элемент 9ый(a[8]=a[8+1];). В принципе не суть проблема в том чтобы функция могла принять как одномерный так и двумерный массив. А куда оно будет двигать не имеет значения. 

Я спрашивал для того чтобы понять цель и оправдывают-ли умственные затраты эти цели. Теперь с уверенностью могу сказать что не оправдывают. Не так давно введены новые функции работы с массивами. Например эта. Плюс ко всему проще скопировать массив сам в себя

int arr[];
// Здесь надо заполнить массив или заполнить его при инициализации
ArrayPrint(arr);
ArrayCopy(arr, arr, 0, 1);
// Здесь можно уменьшить размерность массива.
ArrayPrint(arr);

Или

int arr[][2];
// Здесь надо заполнить массив или заполнить его при инициализации
ArrayPrint(arr);
ArrayCopy(arr, arr, 0, 2);// Здесь надо учитывать размерность массива.
// Здесь можно уменьшить размерность массива.
ArrayPrint(arr);

Надеюсь не напахал серьёзных ошибок.

Документация по MQL5: Операции с массивами / ArrayRemove
Документация по MQL5: Операции с массивами / ArrayRemove
  • www.mql5.com
Если функция используется для массива фиксированного размера, то сам размер массива не меняется: при этом происходит физическое копирование оставшегося "хвоста" в позицию . Для точного понимания работы функции смотрите пример ниже. "Физическое" копирование означает, что копируемые объекты не создаются с помощью вызова конструктора или оператора...
 
Alexey Viktorov:

Если функция примет массив любого типа я проведу проверку с помощь функции 

int  ArrayDimension

Я верну количество измерений и в зависимости от их количество будут предприняты меры. Зачем была создана эта функция int  ArrayDimension если её нельзя применить подумайте сами. Зачем мне возвращать ранг массива если я не могу использовать массив в любом месте?

 
Seric29:

Если функция примет массив любого типа я проведу проверку с помощь функции 

Я верну количество измерений и в зависимости от их количество будут предприняты меры. Зачем была создана эта функция int  ArrayDimension если её нельзя применить подумайте сами. Зачем мне возвращать ранг массива если я не могу использовать массив в любом месте?

Ну... если всё это затевается ради использования ArrayDimension, то желаю удачи. Дерзайте.

 
Alexey Viktorov:

Ну... если всё это затевается ради использования ArrayDimension, то желаю удачи. Дерзайте.

Просто хочется всё это реализовать более технологически и сделать более универсальным, в принципе это какой-то тупизм уже это могли сделать сами программисты кто этот код mql4 разработал, кто придумал этот язык могли бы усовершенствовать его. Я думаю нужно получить внутренний доступ к коду массивов и реализация подобных идей станет возможной. Тоже оно как-то очень много массивов и под каждый массив функцию писать, программа работать не будет от миллиона функций.

 
Seric29:

1. Я так понял что если вы привели пример объявили 2 структуры

2. Значит перед выводом функции вызывается структура, дальше нужно обратиться к их элементам этой структуры

3. Дальше вы вызываете структуру и даёте ей часть имени a1(SD1 a1;), дальше вы вызываете функцию 

не понятно к чему обращается эта функция она автоматически вызовет массив из структуры.

4. Также до сих пор не понятно что принимает функция T & s. Что такое s ссылка на что на переменную на какую на любую даже если это массив. Я записал так

5. Выбивается ошибка 

'[' - array required робот.mq4 1532 8

in template 'void MoveArray(T&)' specified with [T=SD1] робот.mq4 1529 6

'[' - array required робот.mq4 1532 14

in template 'void MoveArray(T&)' specified with [T=SD1] робот.mq4

6. Ниже вы написали что это не возможно так зачем вы представили пример к передать параметры из структуры в функцию.

1. Не объявил, а описал.

2. Не вызывается, а объявляется переменная описанного ранее типа.

3. Структуры не вызывают. Какую часть имени? Вы о чем?

4. Любой тип принимает. Но фактически будет работать со структурой имеющей поле с именем "а" и являющимся массивом.

5. Потому что надо обращаться к полю "а" - оно является массивом.

6. Непосредственно массивы разной размерности невозможно передавать, но если они будут помещены в структуры, то структуры с массивами разной размерности можно передавать.

 
Dmitry Fedoseev:

Имя массива в структуре и в функции должно что-ли совпадать пробовал выбивается ошибка. В общем не знаю как вы записали, я структуру и глобально писал у меня ошибка выбивается



 
Seric29:

Имя массива в структуре и в функции должно что-ли совпадать пробовал выбивается ошибка. В общем не знаю как вы записали, я структуру и глобально писал у меня ошибка выбивается



Внутри функции MoveArray аргумент a - это структура. Соответственно, нужно обращаться к ее полям, а не к самой структуре (что бессмысленно):

template<typename T>
void MoveArray(T & a)
{
   for (int cn = ArraySize(a.a) - 2; cn >= 0; --cn)
      a.a[cn] = a.a[cn + 1];
}

Это если массив одномерный. 

Если двумерный, то нужен немного другой код. Фактически приходим к тому, о чем Дмитрий говорит еще с первой страницы: нет смысла писать общую функцию, в которой разруливать разные размерности массива. Для этого лучше использовать перегрузку.

Причина обращения: