Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятный глюк с динамическими массивами 
:(
    Опции темы
bloodman
  Дата 5.9.2004, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 27.7.2004

Репутация: нет
Всего: нет



Есть функция:
function Create(DB : TDBDinArray):boolean;
begin
...
repeat
...
Move(DB[I + 1], DB[I], ( Length(DB) - I) * SizeOf(DB[0]));
Setlength(DB, Length(DB) -1);
...
Until ...
...
end;

вызываю так:
res:=Create(RightDB);

type
TDBRecord = record
ID : Integer;
Father : Integer;
Name : String[30];
Path : String[255];
Parameters : string[30];
Shortcut : string[30];
IconPath : String[255];
end;

type
TDBDinArray = array of TDBRecord;

По идеи с массивом RightDB ничего не должно случиться НО происходит вот что : При первом вызове функции(move) она удалает элемент не только в DB (лок переменная) но и в RightDB !! почему ??? Причем когда она вызывается 2-й 3... и.т.д. то удаляются элементы только массива DB ! заменял этод код на :
For Z:=I to Length(DB) - 2 do DB[Z]:= DB[Z+1];
толку никакого, тожу самое - элемент преносится на последнее место у обоих массивов sad.gif( Почему непонятно , обясните пожалуйста .
PM MAIL   Вверх
p0s0l
Дата 5.9.2004, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата(bloodman @ 5.9.2004, 22:09)
почему ???

Потому что динамический массив передаётся ссылкой. Т.е. при вызове Create не создаётся копии массива RightDB.
Таким образом в твоём случае эти две записи эквивалентны:
function Create(DB : TDBDinArray):boolean;
function Create(var DB : TDBDinArray):boolean;
Цитата(bloodman @ 5.9.2004, 22:09)
Причем когда она вызывается 2-й 3... и.т.д. то удаляются элементы только массива DB !

Этого быть не должно. Проверь...


--------------------
С уважением, г-н Посол.
PM   Вверх
Girder
Дата 6.9.2004, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата
Таким образом в твоём случае эти две записи эквивалентны:
Код
function Create(DB : TDBDinArray):boolean;
function Create(var DB : TDBDinArray):boolean;
Почти эквивалентны.

В первом случаи передается указатель на сам массив, во втором случаи передается указатель на указатель на массив.
Как следствие: и в том и другом случаи можно менять значения массива(исходного), но только во втором случаи
изменять его размер, т.к. при изменение размера массива происходит вделенение нового участка памяти под этом массив и в первом случаи просто не происходит возврат указателя на новый массив.
Цитата
Цитата (bloodman @ 5.9.2004, 22:09)
Причем когда она вызывается 2-й 3... и.т.д. то удаляются элементы только массива DB !


Этого быть не должно. Проверь...
Согласен. И в первом случаи она не должна удалять, проверить это ты можеш через Length(RightDB) после вызова функции.

Это сообщение отредактировал(а) Girder - 6.9.2004, 12:02


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 6.9.2004, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Спасибо за поправку, про SetLength не подумал...



--------------------
С уважением, г-н Посол.
PM   Вверх
bloodman
Дата 6.9.2004, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 27.7.2004

Репутация: нет
Всего: нет



В том то и дело! я эте проверяю поставив breakpoint и смотрю содержимое масивов DB и RightDb. Я и сам об этом потом подумал (о передаче ссылки) НО тогда бы и вправду удалялись бы все элементы и я бы не мучался над ответом на этот вопрос .
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.