Работа с многомерными массивами ?

 
Является ли в мкл4 двумерный массив одномерным массивом указателей (и так по нарастающей) ?
Собственно в чем вопрос: "Будут ли эквивалентными следующие куски кода ?"
этот
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Buffer4[];

int init(){
   SetIndexBuffer(0,Buffer1);
   SetIndexBuffer(1,Buffer2);
   SetIndexBuffer(2,Buffer3);
   SetIndexBuffer(3,Buffer4);
..........................................
   return(0);  
   }

int start()
{
int limit;
int counted_bars=IndicatorCounted();
if (counted_bars<0) return (-1);
if (counted_bars>0) counted_bars--;
limit=(Bars-counted_bars)-1;
//---- indicator calculation
for(int i=limit; i>=0; i--){
        Buffer1[i]= ................... ;
        Buffer2[i]= ................... ;
        Buffer3[i]= ................... ;
        Buffer4[i]= ................... ;
    }
//----
return(0);
}


так работает :)

и такой


double Buffer[4][];
int init(){
   for( int i=0;i<4;i++){
       SetIndexBuffer( i, Buffer[i+1] ); // или SetIndexBuffer( i, Buffer[i+1] []); ?????
       }
   return(0);  
   }

int start()
{
int limit;
int counted_bars=IndicatorCounted();
if (counted_bars<0) return (-1);
if (counted_bars>0) counted_bars--;
limit=(Bars-counted_bars)-1;
//---- indicator calculation
for(int i=limit; i>=0; i--){
        for(int k = 1; k<=4; k++) {
             MapBuffer[k][i]= ................... ;
             }
    }
//----
return(0);
}



это не работает :(

и если не будут, то как правильно ?

И вообще есть ли возможность работать с многомерными массивами так как это организовано в Си, С++ ?

Спасибо...

 
во втором куске кода ошибка должно быть так :
double Buffer[4][];
int init(){
   for( int i=0;i<4;i++){
       SetIndexBuffer( i, Buffer[i+1] ); // или SetIndexBuffer( i, Buffer[i+1] []); ?????
       }
   return(0);  
   }

int start()
{
int limit;
int counted_bars=IndicatorCounted();
if (counted_bars<0) return (-1);
if (counted_bars>0) counted_bars--;
limit=(Bars-counted_bars)-1;
//---- indicator calculation
for(int i=limit; i>=0; i--){
        for(int k = 1; k<=4; k++) {
             Buffer[k][i]= ................... ;
             }
    }
//----
return(0);
}


только все равно не работает :((((

 
SetIndexBuffer( i, Buffer[i+1] );

Так неправильно. Используйте точный и правильный способ работы с массивами без всяких хакерских штучек.
 
Извините, Ренат - причем здесь "хакерские штучки". Вы писали, что нужно использовать возможности языка Си и С++ - там в стандарте - двумерный массив - это массив указателей на одномерные массивы и соответственно buffer[i] - и будет указателем на нужную строку и будет равен &buffer[i][1], но у мкл не понимает ни *, ни &, поэтому я и спрашиваю как правильно адресовать? на С++ я всегда так адресовал и работало, а по вашим описаниям просто понять не могу...
я пробовал и SetIndexBuffer( i, Buffer[i+1][] ); - если это адекватно С, то это должно быть тоже самое, что и bufer[] для одномерного массива. или я ошибаюсь ? если не сложно подскажите пожалуйста....
 
нету у нас адресной арифметики!!! много раз про это говорили. там где в справочнике говорится, что в качестве аргумента функции используется массив, другие параметры недопустимы - ставьте имя массива.
 
причем здесь "хакерские штучки"

Потому что использование "подразумеваемого" адресного доступа в защищенном языке (MQL 4 есть С без адресной арифметики) и есть "хакерская штучка".
 
Ну нет и бог с ним. Вопрос вот в чем: можно ли и как правильно указать в качестве параметров строки двух и более мерных массивов ? Поскольку ответом на все предыдущие вопросы по программированию была рекомендация обращаться к стандарту Си, С++ я так и попытался работать. Не получилось. У вас в описаниях не нашел. Потому и спрашиваю. Уточню вопрос, на всякий случай:
есть функция и массивы:

int funk( double aray[]);

double d_array1[];
double d_array2[];
double d_array3[];
double d_array4[];

int init() {
funk(d_array1);
funk(d_array2);
funk(d_array3);
funk(d_array4);
return(0); 
}



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

int funk( double aray[]);

double dd_array[8][];// по аналогии с одномерным массивом описываем 2-мерный из 8-ми строк

int init(){
for(int i= 0; i<8;i++){
funk(dd_array[i]);
}
return(0);
}



казалось бы логично - здесь используется имя строки в качестве имени одномерного массива ( и по стандарту C, С++ так), но компилер не пропускает, а пропускает так :

int funk( double aray[]);

double dd_array[8][];

int init(){
for(int i= 0; i<8;i++){
funk(dd_array[i][]);
}
return(0);
}



и не логично и не работает.

Собственно вопрос - если в качестве параметра в функцию передается одномерный массив (копированием или по ссылке), то можно ли туда (в эту функцию) в качестве параметра передать строку двух (или более мерного) массива и как это правильно сделать. Или можно передать только одномерный массив и все ?

С уважением, Владислав.

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