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

 
Ihor Herasko:

...Для этого лучше использовать перегрузку.

Перегрузка не срабатывает на многомерность. Здесь надо писать функции с разными именами для массивов разной размерности.

 
Dmitry Fedoseev:

Перегрузка не срабатывает на многомерность. Здесь надо писать функции с разными именами для массивов разной размерности.

В общем что-то получилось. Можете посмотреть у меня тут не получается кое что 

   struct SD1{
   int a[10];//int q[10][2];
};SD1 a1;

struct SD2{
   int a[10][2];
};SD2 a2;

template<typename T>//,typename W
void MoveArray(T & s){//,W&e
   //Alert(ArrayDimension(s.a));
     int r=0;r=ArrayDimension(s.a);Print("r-ранг: ",r);if(r==1)пишу условие что если ранг равен 1му 
      {for(int cn=0; cn<=8; cn++)                              то крутить этот цикл
     {                
      s.a[cn]=s.a[cn+1];
     }} else if (r==2)            если ранг равен 2ум
      {for(int cn=0; cn<=8; cn++) крутить этот цикл
     {                
      s.a[cn][0]=s.a[cn+1][0];
      s.a[cn][1]=s.a[cn+1][1];
     }}  
}

В конечном итоге залазит в первый цикл не смотря на то что это условие if(r==1)ложное, почему оно туда залазит если ранг равен 2ум, как оно несмотря на ложь заходит в тело где что-то выполняется.Функцию вызываю так

   MoveArray(a2);в OnTick
   for(int i=0;i<10;i++){Print("q: ",i,": ",a2.a[i][0]);}
int yy=ArrayDimension(a2.a);Print("Ранг: ",yy," ");
 
Seric29:

В общем что-то получилось. Можете посмотреть у меня тут не получается кое что 

В конечном итоге залазит в первый цикл не смотря на то что это условие if(r==1)ложное, почему оно туда залазит если ранг равен 2ум, как оно несмотря на ложь заходит в тело где что-то выполняется.Функцию вызываю так

Забавно. Пока нет вызова функции MoveArray() все компилируется. А вот когда есть вызов - нет, компилятор ругается на вторую часть условия, где другой массив.

Ну оно и правильно, потому-что это неправильный подход.

Вот так надо (перегрузкой пользоваться, а не городить огород ведущий к тормозам):

struct SD1{
   int a[10];
};

SD1 a1;

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

SD2 a2;
void OnStart(){
   MoveArray(a1);
   MoveArray(a2);   
}

void MoveArray(SD1 & s){
   for(int cn=0; cn<=8; cn++){                
      s.a[cn]=s.a[cn+1];
   }
}
void MoveArray(SD2 & s){
   for(int cn=0; cn<=8; cn++){                
      s.a[cn][0]=s.a[cn+1][0];
      s.a[cn][1]=s.a[cn+1][1];
   }
}

А еще лучше, вот так (тут массив и в структуру помещать не надо):

int a1[10];

int a2[10][2];

void OnStart(){
   MoveArray1(a1);
   MoveArray2(a2);   
}

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

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

===

Объясните, зачем нужна такая универсальность к которой вы тут стремитесь?

---

Да, и вот этот сдвиг можно сделать функцией ArrayCopy() с массивами любой размерности. Даже где-то писал тут эти функции, только как найти не помню.

 
Dmitry Fedoseev:

===

Объясните, зачем нужна такая универсальность к которой вы тут стремитесь?

---

Да, и вот этот сдвиг можно сделать функцией ArrayCopy() с массивами любой размерности. Даже где-то писал тут эти функции, только как найти не помню.

И я о том-же. Даже в сообщении №14 сделал примеры. И даже перепроверил, работает. Но ТС рассуждает так: "Мы не ищем лёгких путей".

 
Alexey Viktorov:

И я о том-же. Даже в сообщении №14 сделал примеры. И даже перепроверил, работает. Но ТС рассуждает так: "Мы не ищем лёгких путей".

Ну так можно написать 20 функций под каждый массив да и нормально пусть запускает 20 функций, пусть погоняет каждый массив или по копирует, пусть проинициализирует сотни переменных и о какой производительности может идти речь? Тупизм какой-то да и только. Копировать массивы ну да можно скопировать 20 массивов в другие 20 ну и нормально пусть 2 минтуы считает а к концу написания программы будет час считать.

 
Dmitry Fedoseev:

Забавно. Пока нет вызова функции MoveArray() все компилируется. А вот когда есть вызов - нет, компилятор ругается на вторую часть условия, где другой массив.

А еще лучше, вот так (тут массив и в структуру помещать не надо):

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

 
Seric29:

Ну так можно написать 20 функций под каждый массив да и нормально пусть запускает 20 функций, пусть погоняет каждый массив или по копирует, пусть проинициализирует сотни переменных и о какой производительности может идти речь? Тупизм какой-то да и только. Копировать массивы ну да можно скопировать 20 массивов в другие 20 ну и нормально пусть 2 минтуы считает а к концу написания программы будет час считать.

Зачем пару строк кода оформлять в отдельную функцию? Где сказано копировать в другие массивы??? В моих примерах массив копируется "сам в себя".

 
Alexey Viktorov:

Зачем пару строк кода оформлять в отдельную функцию? Где сказано копировать в другие массивы??? В моих примерах массив копируется "сам в себя".

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

 
Seric29:

 очень интересно и нужно.

Чесать левое ухо мизинцем правой ноги тоже интересно. Желаю удачи. Постараюсь больше не встревать в эту тему.

 
Seric29:

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

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

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