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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2014, 22:16   #1
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию Сдвиг элементов массива <->

Ребята прошу сильно не пинать, просто решил переспросить лишний раз...
Код:
  TRecStruct = record
    WTable:  array of DWORD;
    HTable: DWORD;
    NDigit:  array of Word;
  end;

  .....
var
  RecRec: array of TRecStruct;

  .....

SetLength(RecRec, 6);
дальше идет заполнение массива RecRec.
Потом мне к примеру нужно удалить второй элемент в RecRec и остальные сдвинуть влево без потери данных...
Как это правильно сделать ?
Даж и пива не пил, но чего-то не могу сообразить.
Сорри перед сообществом, знаю тема избитая.
z768 вне форума Ответить с цитированием
Старый 21.03.2014, 22:25   #2
PaHaNjkee
Delphi 10 Seattle
Пользователь
 
Аватар для PaHaNjkee
 
Регистрация: 01.11.2010
Сообщений: 90
По умолчанию

Вот, посмотри
Вложения
Тип файла: rar Пример.rar (165.9 Кб, 32 просмотров)
PaHaNjkee вне форума Ответить с цитированием
Старый 21.03.2014, 22:35   #3
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию


Код:
SetLength(Mas,0,0);
Mas:=nil;
А к чему двойное уничтожение в примере ?
Вопрос не снят...
z768 вне форума Ответить с цитированием
Старый 21.03.2014, 22:48   #4
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

z768 В процитированном примере ничего не уничтожается. Удаляется ссылка, не более.
XE5 вне форума Ответить с цитированием
Старый 21.03.2014, 22:54   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
type TRecStruct = record
       WTable:  array of DWORD;
       HTable: DWORD;
     end;
var RecRec: array of TRecStruct;
    i,j: Integer;
procedure PutToMemo;
var s: String;
    m,n: Integer;
begin
  for m:=0 to High(RecRec) do begin
    s:='';
    for n:=0 to High(RecRec[m].WTable) do s:=s+Format('%d,',[RecRec[m].WTable[n]]);
    s:=s+Format(' HTable=%d',[RecRec[m].HTable]);
    Memo1.Lines.Add(s);
  end;
  Memo1.Lines.Add('');
end;
begin
  SetLength(RecRec,6);
  for i:=0 to High(RecRec) do begin
    SetLength(RecRec[i].WTable,i+1);
    for j:=0 to High(RecRec[i].WTable) do RecRec[i].WTable[j]:=10*i+j;
    RecRec[i].HTable:=i;
  end;
  PutToMemo;
  //удаление по индексу 2
  for i:=3 to High(RecRec) do begin
    RecRec[i-1].WTable:=Copy(RecRec[i].WTable);
    RecRec[i-1].HTable:=RecRec[i].HTable;
  end;
  SetLength(RecRec,5);
  PutToMemo;
end;
PS если бы в структуре не было динамических массивов, то можно обойтись просто Move
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.03.2014, 23:19   #6
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию

так вот без динамических массивов в структуре никак не обойтись.
с добавлением наверное проще, потому как новая структура будет добавлена в конец массива...
SetLength(xx, Length(xx) + 1)
В принципе мне мемо и не нужно, а так все понятно.
Спасибо за просвещение.

Последний раз редактировалось z768; 21.03.2014 в 23:22.
z768 вне форума Ответить с цитированием
Старый 21.03.2014, 23:59   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Memo для того, что бы убедиться в корректности кода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.03.2014, 10:30   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я бы подобную задачу - хранилище со сжатием места при удалении (без оглядки на другие функции хранилища) решал через динамическое программирование - одно-/дву- направленный/связный список. Удаление в оном - всего лишь перестановка указателей на соседей.
Если важен ещё и поиск (индексация) , в плане скорости, то надо ещё более усложнять работу хранилища, HashTable/Map/Dictionary и т.д.
phomm вне форума Ответить с цитированием
Старый 25.03.2014, 16:32   #9
z768
Пользователь
 
Регистрация: 21.11.2013
Сообщений: 45
По умолчанию

И еще вопрос вдогонку...
проблему решил вот так
Код:
type TRecStruct = record
       WTable:  array of DWORD;
       HTable: DWORD;
     end;
var RecRec: array of TRecStruct;
....
for i:=3 to High(RecRec) do 
  RecRec[i-1]:=RecRec[i];
SetLength(RecRec, Length(RecRec) - 1);
Все вроде нормально даже если и длина дин массива WTable отличается в динамическом массиве структур.
Насколько это правильно я не знаю, потому и задаю вопрос сообществу, с массивами практически не сталкивался, рыл гугль...
Но понять толком ничего и не смог.

Последний раз редактировалось z768; 25.03.2014 в 16:39.
z768 вне форума Ответить с цитированием
Старый 25.03.2014, 17:50   #10
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
PS если бы в структуре не было динамических массивов, то можно обойтись просто Move
И чем динамические массивы мешают использованию Move?
Somebody вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сдвиг элементов массива (C++) Nomicos Помощь студентам 4 24.01.2013 16:16
Сдвиг элементов массива и вопрос о strcpy neonakaneya Общие вопросы C/C++ 9 09.01.2012 00:27
циклический сдвиг элементов массива Carter Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2011 19:54
Сдвиг элементов массива на 1 влево. Вывести матрицу в Memo Abrokadawr Помощь студентам 3 04.11.2011 23:13
Удаление элементов массива и сдвиг Alex11223 Паскаль, Turbo Pascal, PascalABC.NET 1 12.01.2011 20:01