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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Seric29
777
Seric29  

Есть идея сделать функцию сдвига массивов с технологиями определения типов (int, double и т.д) эту идею можно решить с помощью шаблонов

template<typename T, typename P>
void MoveArray(T &array[],P &array1[][])
{}

а также хотелось бы применить технологию определения ранга массива, например чтобы не нужно было каждый раз писать что массив двумерный? Кто что посоветует: может это невозможно?

Dmitry Fedoseev
57686
Dmitry Fedoseev  
struct SD1{
   int a[];
};
struct SD2{
   int a[][2];
};

void OnStart(){

   SD1 a1;
   SD2 a2;
   MoveArray(a1);
   MoveArray(a2);
   
}

template<typename T>
void MoveArray(T & s){
   Alert(ArrayDimension(s.a));
}
Seric29
777
Seric29  
Dmitry Fedoseev:
void OnStart(){

   SD1 a1;
   SD2 a2;
   MoveArray(a1);
   MoveArray(a2);
   
}
struct SD1{Структуры можно объявить ниже после OnStart()
    int a[];
};
struct SD2{
   int a[][2];
};
template<typename T> void MoveArray(T & s){ s это что, на что ссылается s    Alert(ArrayDimension(s.a)); }
Dmitry Fedoseev
57686
Dmitry Fedoseev  
Пишите как-нибудь так, чтобы было понятно где вы пишите.
Dmitry Fedoseev
57686
Dmitry Fedoseev  

Нашел.

"Структуры можно объявить ниже после OnStart()" 

Ну и что? Можно и на ушах стоять и задом наперед ходить. 

"s это что, на что ссылается s"

Может быть любой тип и самостоятельно созданный, в частности здесь структуры SD1 или SD2. В структуре может быть какой угодно массив. А так просто массив разной размерности не получится пропихнуть даже и через шаблон.

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

Исходя из продемонстрированного вами опыта и понимания в программировании, не сможете вы написать что-то универсальное, что бы оно было действительно стоящим и  имело смыл. 

Alexey Viktorov
28116
Alexey Viktorov  

Я понял так, что вы решили перейти в отдельную тему...

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам

Seric29, 2019.03.16 18:36

Оно не динамическое, просто записывается так в качестве принимаемого аргумента просто ставятся квадратные скобки.


Шаблоны и такое проглатывают?

Для пользовательской функции, кажется во входных параметрах надо указывать размерность второго измерения. 

Dmitry Fedoseev
57686
Dmitry Fedoseev  
Alexey Viktorov:

Я понял так, что вы решили перейти в отдельную тему...


Шаблоны и такое проглатывают?

Для пользовательской функции, кажется во входных параметрах надо указывать размерность второго измерения. 

Когда кажется, креститься надо.

Alexey Viktorov
28116
Alexey Viktorov  
Dmitry Fedoseev:

Когда кажется, креститься надо.

Не хами. Тебе это не к лицу.
Seric29
777
Seric29  
Alexey Viktorov:

Я понял так, что вы решили перейти в отдельную тему...


Шаблоны и такое проглатывают?

Для пользовательской функции, кажется во входных параметрах надо указывать размерность второго измерения. 

Смысл не в том чтобы в скобочках указать второе измерение смысл в том чтобы в одной пользовательской функции можно была рассчитывать т.е. чтобы она одинаково принимала как двумерный массив так и одномерный. Я проверил пример который предоставил мне человек но ничего не получилось у меня.

struct SD1{
   int a[];
};
struct SD2{
   int a[][2];
};

void OnStart(){

   SD1 a1;
   SD2 a2;
   MoveArray(a1);
   MoveArray(a2);
   
}

template<typename T>
void MoveArray(T & s){
   Alert(ArrayDimension(s.a));
}

Тут не понятно как функция MoveArray(a1);связывается с массивом структуры.В новую тему я не переходил я создал одновременно тему и задал вопрос там потому что в общих вопросах теряется мой вопрос и корректных ответов на него нет.

Seric29
777
Seric29  
Dmitry Fedoseev:

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

struct SD1{   int a[];};
struct SD2{   int a[][2];};

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

struct SD2{int a[][2];}; здесь элементом структуры является int a[][2];

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

MoveArray(a1);в скобках вы пишите а1 а как же обратиться к массивам этих структур int a[][2];или int a[];

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

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

int OnInit()здесь старт или тик перепутал.
  {
 SD1 a1;
   MoveArray(a1);
   return(INIT_SUCCEEDED);   }
template<typename T> шаблон
void MoveArray(T & a){ функция
   for(int cn=0; cn<=8; cn++)
     {                тело функции которая будет двигать массив
      a[cn]=a[cn+1];
     }
}
struct SD1{ структура 1ая
   int a[];
};
struct SD2{ структура 2ая
   int a[][2];
};

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

'[' - 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
Ниже вы написали что это не возможно так зачем вы представили пример к передать параметры из структуры в функцию.
Alexey Viktorov
28116
Alexey Viktorov  
Seric29:

Смысл не в том чтобы в скобочках указать второе измерение смысл в том чтобы в одной пользовательской функции можно была рассчитывать т.е. чтобы она одинаково принимала как двумерный массив так и одномерный. Я проверил пример который предоставил мне человек но ничего не получилось у меня.

Тут не понятно как функция MoveArray(a1);связывается с массивом структуры.В новую тему я не переходил я создал одновременно тему и задал вопрос там потому что в общих вопросах теряется мой вопрос и корректных ответов на него нет.

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

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Seric29, 2019.03.16 13:31

Есть идея сделать функцию сдвига массивов с технологиями определения типов (int, double и т.д) эту идею можно решить с помощью шаблонов

template<typename T, typename P>
void MoveArray(T &array[],P &array1[][])
{}

а также хотелось бы применить технологию определения ранга массива, например чтобы не нужно было каждый раз писать что массив двумерный? Кто что посоветует: может это невозможно?

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