Как передать второе измерение двумерного массива по ссылке в функцию? - страница 4

 
Konstantin Nikitin:

Так измените массив на структуру.

И проблема решается просто.

Добрый вечер!


struct SiVAR_Buffer3
{
        double buffer[];
} iVAR_Buffer3[6][6];

if (!Get_iVARSeries(0,Symbol(),1440,NullBarRecount,8,1000,iVAR_Buffer3[0][0].buffer))
   return(0);

Как-то так вы имеете в виду?

Вроде что-то получается... Спасибо.

 
Постников Артем:


не один из вариантов не проходит даже компиляцию, доступ к массиву запрещен и конвертация запрещена.

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

bool Get_iVARSeries(int Number, string symbol,int timeframe, 
                    bool NullBarRecount_, int n, int nBars, 
                    double& InputBuffer[][])

И тогда обращение к ней будет таким

if (!Get_iVARSeries(6,Symbol(),1440,NullBarRecount,8,1000,iVAR_Buffer3))
   return(0);
 
Artyom Trishkin:
Ну нет конечно.
Alexey Volchanskiy:

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

Но ведь для перегрузки функций надо писать класс, без него ведь не получится перегрузка?

А если класс, то это уже ООП. Разве нет?

 
Alexey Viktorov:

Но ведь для перегрузки функций надо писать класс, без него ведь не получится перегрузка?

А если класс, то это уже ООП. Разве нет?

Народ, да что вы это ООП так боитесь ? 

Если не уходить в дебри - то там нет ничего сложного.

Любой класс (и любой объект этого класса) - это, по сути, структура с обрабатывающими функциями. Все !

Соответственно, вы, передавая указатель на объект, передаете в функцию информацию и по данным структуры, и по методам ее обработки.

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

ООП становится сложным, если мы уходим в виртуальные функции и интерфейсы, работаем со сложной иерархией объектов... Но для начинающих туда лезть не следует. А надо брать из ООП то, что дает удобство и легкость поддержки.

 
Georgiy Merts:

Народ, да что вы это ООП так боитесь ? 

Если не уходить в дебри - то там нет ничего сложного.

Любой класс (и любой объект этого класса) - это, по сути, структура с обрабатывающими функциями. Все !

Соответственно, вы, передавая указатель на объект, передаете в функцию информацию и по данным структуры, и по методам ее обработки.

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

ООП становится сложным, если мы уходим в виртуальные функции и интерфейсы, работаем со сложной иерархией объектов... Но для начинающих туда лезть не следует. А надо брать из ООП то, что дает удобство и легкость поддержки.

Мы на троих о другом соображаем.

Для меня важно правильно понять терминологию. В дебри ООП я уже не полезу, а то о чём вы говорите мне не страшно.

 
Постников Артем:

Добрый вечер!

Как-то так вы имеете в виду?

Вроде что-то получается... Спасибо.

Я имел ввиду вот такое применение

struct SiVAR_Buffer3
{
        double buffer[];
} iVAR_Buffer3[6];

if (!Get_iVARSeries(0,Symbol(),1440,NullBarRecount,8,1000,iVAR_Buffer3[0].buffer))
   return(0);

Но если вам еще одно измерение структурного массива надо, то можно и добавить его.
Дальнейшая передача в функции будет чисто массивом double

ToFunction( iVAR_Buffer3[0].buffer );

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

 
Alexey Viktorov:

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

И тогда обращение к ней будет таким

Я же писал несколько раз, что нельзя менять сигнатуру... Решение найдено через структуру, так работает, хоть 2-3 измерения будет в самой структуре. Внутри просто делаем массив одномерный и к нему обращаемся. В общем это помогло найти выход.

 
Konstantin Nikitin:

Я имел ввиду вот такое применение

Но если вам еще одно измерение структурного массива надо, то можно и добавить его.
Дальнейшая передача в функции будет чисто массивом double

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

Да, спасибо. Так работает

 
Alexey Viktorov:

Но ведь для перегрузки функций надо писать класс, без него ведь не получится перегрузка?

А если класс, то это уже ООП. Разве нет?

Не надо. Нужно просто написать функции с одинаковым названием и разными формальными параметрами. И всё.

  1. Func(double &array[])
  2. Func(double &array[][2])
  3. Func(int &array[])
  4. Func(int &array[][2])
  5. ... и т.д. ...
 
Artyom Trishkin:

Не надо. Нужно просто написать функции с одинаковым названием и разными формальными параметрами. И всё.

  1. Func(double &array[])
  2. Func(double &array[][2])
  3. Func(int &array[])
  4. Func(int &array[][2])
  5. ... и т.д. ...

Ребята это вообще не в тему, когда нельзя менять сигнатуру.