Размерность многомерных динамических массивов через ArrayResize - страница 2

 
Vladimir Simakov:
Мдя. Тот же доступ к элементу:
arr.At(i).At(ii).At(iii).At(iv) - а что, оператор [] переопределить не судьба?
Чувствую, из коробки красивого решения не будет. Возьмусь наверное, запилю путную реализацию, благо давно хотел.

СБ - не решения "из коробки", а инструмент для собственных решений. Разницу чувствуете? Или "не судьба" понимать простые истины?

Так что "запилите" для того, чтобы кто-то иной обсмеял ваш "запил" со словами "не судьба" это, "не судьба" то - критиковать-то ума много не требуется...

 
Vladimir Simakov:
Мдя. Тот же доступ к элементу:
arr.At(i).At(ii).At(iii).At(iv) - а что, оператор [] переопределить не судьба?
Чувствую, из коробки красивого решения не будет. Возьмусь наверное, запилю путную реализацию, благо давно хотел.

А зачем самому себе тормоза делать? 

 
struct SA2D{
   struct SA1D{
      int a[];
   } a[];
   void Resize1(int s){
      ArrayResize(a,s);
   }
   void Resize2(int s){
      for(int i=ArraySize(a)-1;i>=0;i--){
         ArrayResize(a[i].a,s);
      }
   }  
   void Resize2(int i,int s){
      ArrayResize(a[i].a,s);
   }      
   int Size1(){
      return ArraySize(a);
   }
   int Size2(int i){
      return ArraySize(a[i].a);
   }   
   void SetValue(int i,int j,int v){
      a[i].a[j]=v;
   }
   int GetValue(int i,int j){
      return a[i].a[j];
   }   
};

SA2D a;


void OnStart(){
   a.Resize1(10);
   a.Resize2(3);
   a.Resize2(0,5);
   
   a.SetValue(1,2,15);
   Print(a.GetValue(1,2));
   
   
}
 
Artyom Trishkin:

СБ - не решения "из коробки", а инструмент для собственных решений. Разницу чувствуете? Или "не судьба" понимать простые истины?

Так что "запилите" для того, чтобы кто-то иной обсмеял ваш "запил" со словами "не судьба" это, "не судьба" то - критиковать-то ума много не требуется...

Согласись, что запись типа: CArrayObj<CArrayObj<CArrayObj<T>*>*>, - даже продвинутого кодера задуматься заставит, кстати, сам с первого раза звездочки неправильно расставил. А здесь всего-навсего объявление 3-х мерного массива. Да, это инструмент, но в том-то и дело, что для того, что бы им пользоваться, надо хотя бы уверенным джуном быть. Суть библиотеки - это дать удобный интерфейс. То же объявление массива в макрос обернуть и сделать CMultiRangeArray(count,T) уже доброе дело, не говоря уже об удобных и специализированных методах добавления/изменения/удаления элементов. Возьми ту же самую STL, там есть std::deque, но при этом, так же представлены std::queue и std::stack, которые являются специализированными обертками над ней с урезанным функционалом. Аналогично и в любимом, создателями местной СБ, C#.

 
Vladimir Simakov:
Мдя. Тот же доступ к элементу:
arr.At(i).At(ii).At(iii).At(iv) - а что, оператор [] переопределить не судьба?
Чувствую, из коробки красивого решения не будет. Возьмусь наверное, запилю путную реализацию, благо давно хотел.

https://www.mql5.com/ru/forum/6729/page3#comment_674794

//+------------------------------------------------------------------+
class CNXdouble
{
        double                 value[];
        int                    size[];
        int                    index;
        int                    ivalue;
public:
                               CNXdouble(const int &n[]);
                              ~CNXdouble()   { ArrayFree(value); ArrayFree(size);}
        double      operator[]   (long x_);
        CNXdouble  *operator[]  (int x_)      { ivalue+=x_*size[index++]; return(GetPointer(this));}
        void         operator=    (double d)    { value[ivalue]=d; index=0; ivalue=0;}
};
//+------------------------------------------------------------------+
CNXdouble::CNXdouble(const int &n[])
{
        int m=1, k=ArraySize(n);
        ArrayResize(size,k);
        size[k-1]=1;
        for(int i=k-2; i>=0; i--) size[i]=n[i+1]*size[i+1];
        for(int i=0; i<k; i++) m*=n[i];
        ArrayResize(value,m);
        index=0;
        ivalue=0;
}
//+------------------------------------------------------------------+
double CNXdouble::operator[] (long x_) 
{
        index=0;
        int i=ivalue;
        ivalue=0;
        return(value[i+(int)x_]);
}
//+------------------------------------------------------------------+
void OnStart()
{
   int n[]={2,3,4,2};      //описание 4-х мерного массива
   int a1=n[0], a2=n[1], a3=n[2], a4=n[3];
   CNXdouble d2(n);
   //запись в массив
   int c=0;
   for(int i=0; i<a1; i++)
       for(int j=0; j<a2; j++) 
           for(int x=0; x<a3; x++) 
               for(int y=0; y<a4; y++)
                   d2[i][j][x][y]=(double)c++;
   //чтение из массива
   string s="";
   for(int i=0; i<a1; i++)
       for(int j=0; j<a2; j++) 
           for(int x=0; x<a3; x++)
               for(long y=0; y<a4; y++)
                   s+=(string)d2[i][j][x][y]+" ";
   Print(s);
}
//+------------------------------------------------------------------+

https://www.mql5.com/ru/forum/6729/page3#comment_674795

class CNArray
{
        CNArray                    *array[];
        double                      value[];
        bool                        last;
        int                         ivalue;
public:
                                   CNArray(const int &n[]);
                                  ~CNArray();
        double      operator[]      (long x);
        CNArray*   operator[]      (int x);
        void        operator=       (double d) { if(last)value[ivalue]=d;}
};
//+------------------------------------------------------------------+
CNArray::CNArray(const int &n[])
{
        int k=ArraySize(n);
        if(k>1)
        {
                ArrayResize(array,n[0]);
                int n1[];
                ArrayResize(n1,k-1);
                for(int i=0; i<k-1; i++) n1[i]=n[i+1];
                for(int i=0; i<n[0]; i++) array[i]=new CNArray(n1);
                ArrayFree(n1);
                last=false;
        }else if(k==1)
        {
                ArrayResize(value,n[0]);
                last=true;
        }
}
//+------------------------------------------------------------------+
CNArray::~CNArray()
{ 
        if(!last)
        {
                int n=ArraySize(array);
                for(int i=0; i<n; i++) delete array[i];
                ArrayFree(array);
        }else ArrayFree(value);
}
//+------------------------------------------------------------------+
double CNArray::operator[](long x) 
{
        if(last) return(value[(int)x]); else return(0);
}
//+------------------------------------------------------------------+
CNArray* CNArray::operator[](int x)
{ 
        if(last)
        {
                ivalue=x; 
                return(GetPointer(this));
        }else return(array[x]);