Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как пользоватся Move?


Kolan ©   (2006-10-17 14:38:00) 

Здравствуйте,
 Научите.

Нужно скопировать один массив в другой. Вот так делаю без Move и все работает.

SetLength(FPackage, Length(Package));
 for I := Low(Package) to High(Package) do
   FPackage[I] := Package[I];
 


Вот так я делаю с Move и в итоге получаю AV.

SetLength(FPackage, Length(Package));
 Move(Package, FPackage,
   Length(Package)*SizeOf(Package[Low(Package)]));


1. В чем моя ошибка?
2. Как правильно.


Kolan   (2006-10-17 15:07:00) [1]


> palva ©   (17.10.06 14:59) [10]

Не больше ничего, конечно надо было это сказать.

> MBo ©   (17.10.06 14:58) [9]

А вот оно как.. шас пойду конкатенацию сделаю..


palva   (2006-10-17 14:59:00) [2]

> Не выйдет Package - открытый...
Первый раз об этом говоришь, может еще что-нибудь скрываешь?


MBo   (2006-10-17 14:58:00) [3]

>И вопрос №1 для меня пока на 100 не разрешен.
var-параметры представляют собой передаче параметра по ссылке - неявные указатели - процедуре передается адрес, однако программист передает не адрес в явном виде (с использованием оператора @ или указательных типов), а саму переменную, а компилятор подставляет в вызов ее адрес.
Динамические массивы и длинные строки - суть указатели на нулевой элемент массива (первый символ строки). Если использовать переменную-массив как var-параметр, получится передача указателя на указатель, а нужны данные, поэтому в подобных случаях нужно использовать Arr[0], String[1], или PChar(String)^


Kolan   (2006-10-17 14:57:00) [4]

Может там
FPackage[Low( FPackage)]

Плохой пример взял имена похожи :(


Palladin   (2006-10-17 14:55:00) [5]


> FPackage[Low(Package)]


пока, применительно к Делфи, это равносильно FPackage[0], бо в открытых и динамических массивы нижний индекс всегда равен 0.. а написал так... просто... по инерции :)


Kolan   (2006-10-17 14:54:00) [6]


> FPackage[ Low(Package)]

Почему Low Package, а не FPackage?


Kolan   (2006-10-17 14:52:00) [7]


> Зачем move? Присваивай массивы:

Не выйдет Package - открытый...
SavePackage(Package: array of Byte);


Kolan   (2006-10-17 14:50:00) [8]


> SetLength(FPackage, Length(Package));
> Move(Package[0], FPackage[Low(Package)], Length(Package)*SizeOf(Package[Low(Package)]

За пример благодарю.

> Это уже третья или четвертая ветка, где ты спрашиваешь практически
> одно и то же - об использовании динамических массивов (строк)
> в var-параметрах...

И вопрос №1 для меня пока на 100 не разрешен.

Вот это особенно FPackage[Low(Package)] остальные параметры вроде ясно ...


palva   (2006-10-17 14:49:00) [9]

Зачем move? Присваивай массивы:
{$APPTYPE CONSOLE}
type
 Tm = array of char;
var
 m1, m2: Tm;
begin
 SetLength(m1, 2);
 m1[0] := 'q';
 m1[1] := 'w';
 m2 := m1;
 WriteLn(m2[0], m2[1]); // qw
end.


MBo   (2006-10-17 14:43:00) [10]

Это уже третья или четвертая ветка, где ты спрашиваешь практически одно и то же - об использовании динамических массивов (строк) в var-параметрах...


Palladin   (2006-10-17 14:42:00) [11]

то что написано справедливо для статических массивов, в случае динамических

SetLength(FPackage, Length(Package));
Move(Package[0], FPackage[Low(Package)], Length(Package)*SizeOf(Package[Low(Package)]


Наверх

Титульная страница Поиск, карта сайта Написать письмо