как удалить строку в двухмерном массиве

 

Помогите понять! Подозреваю что я удаляю неправильно..


//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int array[][3];
   ArrayResize(array,3);
   // 0 - строка - 3 столбца
   array [0][0]=2;
   array [0][1]=8;
   array [0][2]=5;
   // 1 - строка - 3 столбца
   array [1][0]=7;
   array [1][1]=3;
   array [1][2]=9;
   // 2 - строка   - 3 столбца - ХОЧУ ЕЕ УДАЛИТЬ!
   array [2][0]=4;
   array [2][1]=8;
   array [2][2]=6;

   ArrayDelete(array,2);//Удаляем последнюю строку массива
   Print("результат после удаления ");

   for(int i=0; i<2; i++)
      for(int j=0; j<3; j++)
         Print(array[i][j]);
  }
//+------------------------------------------------------------------+

void ArrayDelete(int &array[][3],int i)
  {
   ArrayCopy(array,array,i,i+1);
   ArrayResize(array,ArrayRange(array,0)-1);
  }
//+------------------------------------------------------------------+
 
Tango_X:

Помогите понять! Подозреваю что я удаляю неправильно..


Внимательней надо читать документацию.

int  ArrayCopy(
   void&        dst_array[],         // куда копируем
   const void&  src_array[],         // откуда копируем
   int          dst_start=0,         // с какого индекса пишем в приемник
   int          src_start=0,         // с какого индекса копируем из источника
   int          count=WHOLE_ARRAY    // сколько элементов
   );

У вас получается что при копировании массива "сам в себя", писать надо во вторую строку, но читать с третьей. А её-то и нету.

И ещё очень важное замечание: При копировании многомерный массив переводится в одномерный. Поэтому надо копировать с индекса "индекс строки"*"размерность во втором измерении.

Получается что копировать надо в частном случае

ArrayCopy(array, array, 3, 6, 3);// Выделенное можно опустить.

Дай Бог не ошибся.

И в этом случае будет удалена строка с индексом 1 из массива, а не 2.

А что за цикл с внутренним циклом в конце кода? Какова его роль?

 
Alexey Viktorov:

Внимательней надо читать документацию.

У вас получается что при копировании массива "сам в себя", писать надо во вторую строку, но читать с третьей. А её-то и нету.

И ещё очень важное замечание: При копировании многомерный массив переводится в одномерный. Поэтому надо копировать с индекса "индекс строки"*"размерность во втором измерении.

Получается что копировать надо в частном случае

Дай Бог не ошибся.

И в этом случае будет удалена строка с индексом 1 из массива, а не 2.

А что за цикл с внутренним циклом в конце кода? Какова его роль?

спасибо разобрался! кому интересно привожу исправления


//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int array[][3];
   ArrayResize(array,3);
   // 0 - строка - 3 столбца
   array [0][0]=2;
   array [0][1]=8;
   array [0][2]=5;
   // 1 - строка - 3 столбца
   array [1][0]=7;
   array [1][1]=3;
   array [1][2]=9;
   // 2 - строка   - 3 столбца - ХОЧУ ЕЕ УДАЛИТЬ!
   array [2][0]=4;
   array [2][1]=8;
   array [2][2]=6;

   
   ArrayDelete(array,2);//Удаляем последнюю строку массива
   Print("результат после удаления ");

   for(int i=0; i<2; i++)
      for(int j=0; j<3; j++)
         Print(array[i][j]);
  }
//+------------------------------------------------------------------+

void ArrayDelete(int &array[][3],int i)
  {
   int j=i*3; 
   ArrayCopy(array,array,j,j+3);
   ArrayResize(array,ArrayRange(array,0)-1);
  }
//+------------------------------------------------------------------+
 

А что за цикл с внутренним циклом в конце кода? Какова его роль?

Вывод значений двухмерного массива.

 
Tango_X:

Вывод значений двухмерного массива.

Вот такая невнимательность у меня впервые)))))))

Циклы увидел, а Print пропустил...

 

Как по мне, так проще структуру использовать. И не изобретать велосипед.

struct SArray
{
     int a[];
} array[];

void OnStart()
  {
//---
   if( ArrayResize(array,3) != 3 ) return;
   for(int i=0; i<ArraySize(array); i++)
      if( ArrayResize(array[i].a, 3) != 3 ) return;
   // 0 - строка - 3 столбца
   array[0].a[0]=2;
   array[0].a[1]=8;
   array[0].a[2]=5;
   // 1 - строка - 3 столбца
   array[1].a[0]=7;
   array[1].a[1]=3;
   array[1].a[2]=9;
   // 2 - строка   - 3 столбца - ХОЧУ ЕЕ УДАЛИТЬ!
   array[2].a[0]=4;
   array[2].a[1]=8;
   array[2].a[2]=6;

   for(i=0; i<2; i++)
      for(int j=0; j<3; j++)
         Print(array[i].a[j]);
  }

И делайте с ней что хотите.

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