Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2014, 04:37   #1
Serik2010
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 26
Злость Удаление строки двумерного массива со сдвигом

Приветствую всех!

Тема вроде бы и банальная, но ответов на разных форумах не нашёл почему-то...

Итак есть двумерный массив. Например:

[1,1], [0,0], [1,1].

Задача удалить из него [0,0] и получить массив [1,1], [1,1].

Вот что я пытаюсь сделать:
Код:
 
  schetchik_catalogov      := Form6.CheckListBox1.Count;

  for i := 1 to schetchik_catalogov do begin
    if Form6.CheckListBox1.Checked[i - 1] then begin
      for j := 0 to length(count_zone[i]) do begin
        zonePassList[checkedZoneCount, j] := count_zone[i, j];
      end;
      checkedZoneCount := checkedZoneCount + 1;
    end;
  end;

  count_zone := nil;
  count_zone := zonePassList;
Пытаюсь перезаписать "нужные" строки в новый массив, потом полностью чищу count_zone, и копирую туда всё из временного массива zonePassList.

Ругается на length(count_zone[i]).
Serik2010 вне форума Ответить с цитированием
Старый 26.02.2014, 08:32   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

без исходного кода этот вырванный фрагмент бесполезен.
Тут даже не видно, какого типа у Вас count_zone и zonePassList


p.s. а ещё лучше - вытаскиваете из своего проекта нужный кусочек в отдельный (тестовый) проект. Добиваетесь, чтобы он компилировался и работал (хоть и неправильно), потом запаковываете исходники проекта в архив, архив выкладываете на форум.
Шансы получить КОНКРЕТНЫЙ ответ в виде подходящего Вам кода резко увеличиваются.

Последний раз редактировалось Serge_Bliznykov; 26.02.2014 в 08:34.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.02.2014, 13:51   #3
Serik2010
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 26
Злость

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
без исходного кода этот вырванный фрагмент бесполезен.
Тут даже не видно, какого типа у Вас count_zone и zonePassList
Приветствую, спасибо, что откликнулись.

Проект разобрать я не смогу, тут настолько всё накручено.

Тип count_zone и zonePassList - Tmy2ArrayStr:

Код:
  Tmy1ArrayStr     = array of string;
  Tmy2ArrayStr     = array of Tmy1ArrayStr;

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

Есть CheckListBox1 в котором есть список, моя задача пробежаться по этому списку и просмотреть, то, что выбрано - переписать во временный массив zonePassList, потом обнулить count_zone = nil и записать в него весь zonePassList.


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

Цитата:
Итак есть двумерный массив. Например:

[1,1,1;1,1,1], [0,0,0;0,0,0], [1,1,1;1,1,1].

Задача удалить из него [0,0,0;0,0,0] и получить массив [1,1,1;1,1,1], [1,1,1;1,1,1].

Последний раз редактировалось Serik2010; 26.02.2014 в 13:53.
Serik2010 вне форума Ответить с цитированием
Старый 26.02.2014, 14:59   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Пример из интернета:
Код:
var 
myArray: TStringArray; 
...//delete fifth element 
DeleteArrayItem(myArray, 5) ;
~~~~~~~~~~~~~~~~~~~~~~~~~
type
   TStringArray = array of string;

procedure DeleteArrayItem(var X: TStringArray; const Index: Integer) ;
begin
   if Index > High(X) then Exit;
   if Index < Low(X) then Exit;
   if Index = High(X) then
   begin
     SetLength(X, Length(X) - 1) ;
     Exit;
   end;
   Finalize(X[Index]) ;
   System.Move(X[Index +1], X[Index],(Length(X) - Index -1) * SizeOf(string) + 1) ;
   SetLength(X, Length(X) - 1) ;
end;
В Вашем случае, похоже, может быть удалена не одна строка:
Код:
checkedZoneCount := 0;
for i := 0 to Form6.CheckListBox1.Count - 1 do
  if Form6.CheckListBox1.Checked[i] then
  begin
    count_zone[checkedZoneCount] := count_zone[i];
    inc(checkedZoneCount);
  end;
setlength(count_zone, checkedZoneCount);
Код не проверял.
UPD
Код работает - удаляет строки, но на возможные утечки памяти не проверял.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 26.02.2014 в 15:12.
BDA вне форума Ответить с цитированием
Старый 26.02.2014, 15:00   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для динамического массива с одинаковым количеством колонок во всех строках так можно
Код:
type TMyArray = array of array of String;

function DelRow(DeletedRow: Integer; var pArray: TMyArray): Boolean;
var i,j: Integer;
begin
  Result:=(DeletedRow>=0) and (DeletedRow<=High(pArray));
  if Result then begin
    for i:=DeletedRow to High(pArray)-1 do
      for j:=0 to High(pArray[i]) do
        pArray[i,j]:=pArray[i+1,j];
    SetLength(pArray,High(pArray),High(pArray[0])+1);
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var xArray: TMyArray;
    i,j: Integer;
begin
  SetLength(xArray,3,2);
  for i:=0 to High(xArray) do
    for j:=0 to High(xArray[i]) do xArray[i,j]:=IntToStr(i);
  DelRow(1,xArray);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.02.2014, 23:50   #6
Serik2010
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 26
Хорошо

Цитата:
Сообщение от BDA Посмотреть сообщение
В Вашем случае, похоже, может быть удалена не одна строка:
Код:
checkedZoneCount := 0;
for i := 0 to Form6.CheckListBox1.Count - 1 do
  if Form6.CheckListBox1.Checked[i] then
  begin
    count_zone[checkedZoneCount] := count_zone[i];
    inc(checkedZoneCount);
  end;
setlength(count_zone, checkedZoneCount);
Код не проверял.
UPD
Код работает - удаляет строки, но на возможные утечки памяти не проверял.
Громадное спасибо!!! То, что нужно!! Именно с индексами я запутался...
Serik2010 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление строки двумерного массива со сдвигом Hesh Общие вопросы C/C++ 1 23.09.2012 22:34
удаление строки и столбца из двумерного массива Hitory Общие вопросы Delphi 0 06.06.2012 20:59
Удаление строк и столбцов двумерного массива Павел Шилин Паскаль, Turbo Pascal, PascalABC.NET 1 20.05.2012 21:07
Удаление строки из двумерного динамического массива hidraulik Общие вопросы C/C++ 0 08.12.2009 10:48
Удаление элемента массива со сдвигом последующих beregok Общие вопросы C/C++ 11 09.01.2009 17:11