![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
bloodman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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]; толку никакого, тожу самое - элемент преносится на последнее место у обоих массивов ![]() |
|||
|
||||
p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Потому что динамический массив передаётся ссылкой. Т.е. при вызове Create не создаётся копии массива RightDB. Таким образом в твоём случае эти две записи эквивалентны: function Create(DB : TDBDinArray):boolean; function Create(var DB : TDBDinArray):boolean;
Этого быть не должно. Проверь... -------------------- С уважением, г-н Посол. |
||||
|
|||||
Girder |
|
||||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
В первом случаи передается указатель на сам массив, во втором случаи передается указатель на указатель на массив. Как следствие: и в том и другом случаи можно менять значения массива(исходного), но только во втором случаи изменять его размер, т.к. при изменение размера массива происходит вделенение нового участка памяти под этом массив и в первом случаи просто не происходит возврат указателя на новый массив.
Это сообщение отредактировал(а) Girder - 6.9.2004, 12:02 -------------------- Как слышим, так и пишим. Истина где-то там... |
||||||
|
|||||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Спасибо за поправку, про SetLength не подумал...
-------------------- С уважением, г-н Посол. |
|||
|
||||
bloodman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 27.7.2004 Репутация: нет Всего: нет |
В том то и дело! я эте проверяю поставив breakpoint и смотрю содержимое масивов DB и RightDb. Я и сам об этом потом подумал (о передаче ссылки) НО тогда бы и вправду удалялись бы все элементы и я бы не мучался над ответом на этот вопрос .
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |