![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как пользоватся 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)]