Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443

сдвиг в массиве состоящим из сложных объектов

20.01.2012, 16:49. Показов 1477. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть массив
Delphi
1
A: array[1..10] of TMyObject
удаляем А[3] элемент командой FreeAndNil (А[3])

Вопрос Как теперь передвинуть все последующие назад ,те A[3]:=A[4], A[4]:=A[5] и тд
Дело в том, что простое приравнивание ничего не дает.
Команда
Delphi
1
move (A[4],A[3],sizeof)
работает , но выходит какая-то чепуха, Ничего понять не могу.........

Скажите Как сдвинуть?

Добавлено через 1 минуту
Еще хочу добавить, что раз была команда Free значит объект надо создать, наверное

Добавлено через 24 минуты
и еще дело в том что это массив визуальных объектов расположенных на экране, их должно быть видно
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.01.2012, 16:49
Ответы с готовыми решениями:

В одномерном массиве, состоящим из n целых элементов, вычислить
В одномерном массиве, состоящим из n целых элементов, вычислить: 1) количество нечетных элементов массива, оканчивающихся на 7; 2)...

В однородном массиве, состоящим из n вещественных элементов, вычислить:
В однородном массиве, состоящим из n вещественных элементов, вычислить: 1)максимальный по модулю элемент массива 2)сумму элементов...

в одномерном массиве состоящим из веществ элементов вычислить:
подскажите плс) наброски есть.. в одномерном массиве состоящим из веществ элементов вычислить: 1) сумму элементов массива,...

10
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
20.01.2012, 17:12
Cheb, опубликуй код. - Тогда можно будет начать разбираться.
1
brony
77 / 57 / 4
Регистрация: 02.01.2012
Сообщений: 521
20.01.2012, 17:41
Цитата Сообщение от Cheb Посмотреть сообщение
Вопрос Как теперь передвинуть все последующие назад ,те A[3]:=A[4], A[4]:=A[5] и тд

i, kk: integer;
begin

kk:= номер символа, что удалил
for i:= kk to длина массива
A[i-1]:=i;




вроде так. каждый последующий элемент сдвигаешь на 1 назад.
0
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443
20.01.2012, 20:22  [ТС]
вот код Похоже копирование объектов типа А=В не работает. Чем заменить? Может через указатели или загрузить объект в поток, и вытащить?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var 
ALabel : array [1..maxobj] of TStaticText; 
......
......
// процедура удаления
Procedure TTableForm.DelObj(ID:integer);
begin
  if ALabel[ID]=nil then exit; // не удалять если объект не существует
  for j:=ID to Count-1 do      // ID-элемент для удаления
    begin
    ALabel[j]:=ALabel[j+1];   // копируем на его место следующий <ЭТА СТРОКА НЕ РАБОТАЕТ>
    end;
  FreeAndNil(ALabel[Count]); // удаляем последний
  Count:=Count-1; // количество меньше на 1
end;
Добавлено через 1 минуту
Цитата Сообщение от ncuX1 Посмотреть сообщение
i, kk: integer;
A[i-1]:=i;
вроде так. каждый последующий элемент сдвигаешь на 1 назад.
Что Это такое?
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
21.01.2012, 02:58
Delphi
1
2
3
4
5
6
7
8
Procedure TTableForm.DelObj(ID:integer);
begin
  if ALabel[ID]=nil then exit; // не удалять если объект не существует
  ALabel[ID].free;
  dec(count);
  for j:=ID to Count do      // ID-элемент для удаления
    ALabel[j]:=ALabel[j+1];   // копируем на его место следующий
end;
1
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
21.01.2012, 10:01
может было бы куда проще хранить все в TList;
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
21.01.2012, 14:00
Cheb, в твоём коде ссылка на тот объект, который надо удалить теряется. А сам этот объект так и остаётся в памяти. Кроме этого, ты удаляешь из памяти другой объект - ссылка на который расположена в конце массива. И при этом получаешь битую ссылку на объект в предпоследнем элементе массива - потому что эта ссылка после сдвига элементов равна ссылке в последнем элементе, а последний элемент уже удалён из памяти. Из-за этого программа начинает работать неправильно.
Метод надо переписать таким образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var 
ALabel : array [1..maxobj] of TStaticText; 
......
......
// процедура удаления
Procedure TTableForm.DelObj(ID:integer);
var
  i : Integer;
begin
  //Если неверный индекс - выходим.
  if (ID < Low(ALabel)) or (ID > Count) then Exit;
  //Удаляем из памяти экземпляр под индексом ID.
  FreeAndNil( ALabel[ID] );
  //Выполняем сдвиг элементов.
  for i := ID to Count - 1 do begin ALabel[i] := ALabel[i + 1];
  //Теперь количество элементов стало на 1 меньше.
  Dec(Count);
end;
---
Cheb, расскажу, что было неверного в исходном коде:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var 
ALabel : array [1..maxobj] of TStaticText; 
......
......
// процедура удаления
Procedure TTableForm.DelObj(ID:integer);
begin
  //Здесь не надо выходить - сказано удалить, значит надо этот элемент удалить из массива.
  //Если ссылка пустая, то мы просто не будем удалять экземпляр из памяти, так как его нет.
  //Но сам элемент мы должны удалить из массива.
  if ALabel[ID]=nil then exit;
  
  //Здесь, сам по себе, сдвиг выполнен правильно. Но при этом мы потеряли ссылку на тот объект,
  //который нам надо удалить.
  for j:=ID to Count-1 do
    begin
    ALabel[j]:=ALabel[j+1];
    end;
 
  //Вот здесь удаляется из памяти совсем не тот объект. Нам надо удалить объект, на который
  //ссылается элемент массива с индексом ID. А здесь вместо этого удаляется из памяти
  //объект, на который ссылается последний элемент массива. Кроме этого, после сдвига
  //в последнем и предпоследнем элементах массива мы имеем одинаковые ссылки, которые
  //ссылаются на один и тот же объект. И если мы сейчас удалим из памяти объект, на который
  //ссылается последний элемент массива, то ссылка, которая хранится в предпоследнем
  //элементе массива окажется битой - т. е. она будет ссылаться на объект, которого уже
  //не существует - т. к., он только что нами же был удалён.
  FreeAndNil(ALabel[Count]);
 
  //Эта строка верная:
  Count:=Count-1;
end;
2
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443
23.01.2012, 08:43  [ТС]
Цитата Сообщение от Alex_pac Посмотреть сообщение
может было бы куда проще хранить все в TList;
может быть но мне не нужен TList. Мне нужен массив из визуальных объектов

Добавлено через 3 минуты
Mawrat, спасибо огромное прекрасно работает код. Я ещё не понял что было не так, Думал , что перед удалением объекта нужно его передвинуть и удалить последний.

Добавлено через 11 часов 24 минуты
Не-е , Mawrat хотя код и работает, но если прогонять через F7 видно, что последний элемент всегда остается (либо ссылка на него- еще не разобрался). Заметил, что когда я эту процедуру в цикле делаю-пытаясь удалить ВСЕ элементы, один-два остаются... Проблема в цикле решилась пока, так, что я цикл делаю с конца до 1-го элемента, тк последний элемент удаляется корректно. Ладно пока так , потом разберусь...
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
23.01.2012, 12:00
Цитата Сообщение от Cheb Посмотреть сообщение
Не-е , Mawrat хотя код и работает, но если прогонять через F7 видно, что последний элемент всегда остается
Правильно, что остаётся - так и должно быть. Мы же должны удалить не последний элемент, а тот, у которого индекс равен ID. Последний элемент надо удалять только если ID = Count. Надо помнить, что элементами массива являются указатели на объекты. И мы должны работать и с указателями и с самими объектами. После сдвига элементов массива влево ссылка (указатель) на последний элемент повторится (скопируется) и в последнем и предпоследнем элементах массива окажутся одинаковые указатели, указывающие на один и тот же объект. После этого мы уменьшаем Count - количество значимых элементов и нам не важно какие ссылки (указатели) записаны в элементы с индексами, большими, чем Count.
В приложенных рисунках я показал, что происходит при выполнении метода TTableForm.DelObj().
На рисунках:
PSt1, PSt2, ... - это элементы массива, т. е., это указатели на экземпляры класса TStaticText.
St1, St2, ... - это сами экземпляры класса TStaticText.
Миниатюры
сдвиг в массиве состоящим из сложных объектов   сдвиг в массиве состоящим из сложных объектов  
1
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443
23.01.2012, 14:08  [ТС]
Ага. Понятно, просто у меня все привязано к тому существует ли адрес или нет. Поэтому я и использовал FreeAndNil
И во время прогона я видел эту последнюю ссылку. Стало быть надо её просто "обнулить" сделать A[i]=nil
Спасибо за картинки. Давно хотел в этом разобраться.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
23.01.2012, 15:25
Цитата Сообщение от Cheb Посмотреть сообщение
Ага. Понятно, просто у меня все привязано к тому существует ли адрес или нет.
Это подозрительно. Наверное, лучше к этому не привязываться. Хотя я не знаю особенностей программы и на верняка утверждать не возьмусь.
Цитата Сообщение от Cheb Посмотреть сообщение
Поэтому я и использовал FreeAndNil
В программе желательно все вызовы Free() заменить на FreeAndNil(). Почему надо так поступать, есть хорошая статья в блоге GunsMoker-a:
Почему всегда нужно использовать FreeAndNil() вместо Free().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2012, 15:25
Помогаю со студенческими работами здесь

Найдите количество элементов в массиве состоящим из вещественных чисел
Найдите количество элементов в массиве А состоящим из вещественных чисел, абсолютная величина которых больше 7. Входной файл...

Визуализация Сложных Объектов
Здравствуйте! Никак не получается скомпилировать файл под OpenGL на VS15 Библиотеки подключал, надеюсь, правильно Постоянно...

В одномерном массиве состоящим из n элементов вычислить номер минимального элемента
в одномерном массиве состоящим из n элементов вычислить 1)номер минимального элемента 2)сумма элементов расположенных между первым и...

В массиве R, состоящим из N элементов заменить все отрицательные элементы на ноль
Задача на одномерные массивы: В массиве R, состоящим из N элементов заменить все отрицательные элементы на ноль. Результат распечатать...

В одномерном массиве, состоящим из N вещественных элементов, найти максимальный элемент
5. В одномерном массиве, состоящим из N вещественных элементов, найти максимальный элемент. Использовать только стандартные и простые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru