Можно ли передать массив в функцию по схеме указатель на указатель?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Seric29
778
Seric29  
Как создать указатель указывающий на массив и через этот указатель передать массив в функцию, возможно ли подобное?
Sergey Dzyublik
4529
Sergey Dzyublik  
Seric29:
Как создать указатель указывающий на массив и через этот указатель передать массив в функцию, возможно ли подобное?

Можно, через класс-обертку над массивом передавать в функцию указатель на класс.

Seric29
778
Seric29  
Sergey Dzyublik:

Можно, через класс-обертку над массивом передавать в функцию указатель на класс.

А где будет объявлен массив внутри класса или можно объявлять обычным способом, можете показать как это будет выглядеть?

Alexey Volchanskiy
27322
Alexey Volchanskiy  
Seric29:

А где будет объявлен массив внутри класса или можно объявлять обычным способом, можете показать как это будет выглядеть?

Элементарно

class CArray : public Cobject // можно и не наследоваться
{
public:
    double m_Array[100];
}

где-то в коде...

Carray *arr = new CArray;
arr.m_Array[22] = 1.23456;

void GetArr(Carray *_arr)
{
    double data = _arr.m_Array[22];
}
Seric29
778
Seric29  
Alexey Volchanskiy:

Элементарно

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

Оператор не применяется для создания массивов объектов. Я записал так

#property version   "1.00"
#property strict
string iComments="\n 
 class CArray : public Cobject 
{
public:
    double m_Array[100];
}//дальше в OnInit()
 {Carray *arr = new CArray;
   arr.m_Array[22] = 1.23456;

....
}

Ошибок мама не горюй. Может нужно расписать класс?

Dmitry Fedoseev
57466
Dmitry Fedoseev  
Seric29:

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

new, потому что это главное условие задачи - использование указателя.

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

Seric29
778
Seric29  
Dmitry Fedoseev:

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

Понятно значит тут либо использовать высокомерные массивы чтобы они были одного типа или запись в файл. В с++ это возможно там есть доступ к памяти вот пример

#include "stdafx.h"
#include <conio.h>
#include <iostream>

using std::cout;
using std::endl;
using std::cin;

template<typename T> void Fun(T a[],size_t m=2,size_t n=2, T r=0)
{
        for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) 
                        {
                    (a[i * n + j ])=(a[i * n + j ])*5;
                        cout <<(a[i * n + j ])<<" "<<endl;
                    }
        }cout<<endl; 
}

int _tmain(int argc, _TCHAR* argv[])
{
        int     mas[6]={1,2,3,4,5,6};
        double mas1[2][2]={{1.4,4.2},{2.8,6.7}};//int //{{},{}};
        int mas2[2][2][2];

        Fun(*mas1);//Для 2умерного массива передача по ссылке, но в mql4 все массивы передаются по ссылке 
        Fun((mas),6,1);
        for(int i=0;i<2;i++)
        {for(int t=0;t<2;t++)
        {cout<<mas1[i][t]<<" "<<endl;}}
        _getch();
        return 0;
}

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

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