![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение двумерных динамических массивов
Начинающий_1 © (2006-08-24 12:33:00)Пытаюсь сравнивать два массива.
CompareArrays выдает False,а CompareArrays_ - True
В чем ошибка ?
type
PSingleArr = ^TSingleArr;
TSingleArr = array of Single;
PDblSingleArr = ^TDblSingleArr;
TDblSingleArr = array of TSingleArr;
function CompareArrays(const pArr1, pArr2: PDblSingleArr): Boolean;
begin
Result:=CompareMem(pArr1^, pArr2^, Length(pArr1^) * Length(pArr1^[0]) * SizeOf(Single));
end;
function CompareArrays_(const pArr1, pArr2: TDblSingleArr): Boolean;
var
i, j: integer;
begin
for i:=Low(pArr1) to High(pArr1) do
for j:=Low(pArr1[i]) to High(pArr1[i]) do
if pArr1[i, j] <> pArr2[i, j] then
begin
Result:=False;
Exit;
end;
Result:=True;
end;
И, соответственно, возникает еще вопрос: Как скопировать один массив в другой ?
Начинающий_1 (2006-08-24 14:06:00) [1]Спасибо
guav (2006-08-24 13:58:00) [2]> Если использовать закоментированный код, то все работает,
> иначе - нет.
Это нормально.
> CompareMem(@pArr1[0, 0], @pArr2[0, 0], Length(pArr1) * Length(pArr1[0])
> * SizeOf(Single));
Это и не будет работать для двумерного дин. массива.
Двумерный массив представляет собой одномергый массив из одномерных массивов. Переменная типа дин массив - это ссылкана некоторыю структуру, которая содержит данные массива по неотрицательным смещениям.
Т.е. использования CompareMem подойдёт только для самой внутренней размерности, для остальных приходится использовать цикл. То же самое и при копировании через Copy.
Сергей М. (2006-08-24 13:54:00) [3]
> Начинающий_1 (24.08.06 13:49) [8]
И сравнивать многомерные массивы нельзя таким способом.
Начинающий_1 (2006-08-24 13:49:00) [4]>guav © (24.08.06 12:54) [5]
>И вообще делать подобное не стоит
Я еще до копирования не дошел. Мне бы со сравнением разобраться :))
Что-то у меня не получается :((
Если использовать закоментированный код, то все работает, иначе - нет.
function CompareArrays(const pArr1, pArr2: TSingleArr): Boolean;
begin
Result:=CompareMem(@pArr1[0], @pArr2[0], Length(pArr1) * SizeOf(Single));
end;
function CompareArraysDbl(const pArr1, pArr2: TDblSingleArr): Boolean;
var
i: integer;
begin
// for i:=Low(pArr1) to High(pArr1) do
// if not CompareArrays(pArr1[i], pArr2[i]) then
// begin
// Result:=False;
// Exit;
// end;
// Result:=True;
Result:=CompareMem(@pArr1[0, 0], @pArr2[0, 0], Length(pArr1) * Length(pArr1[0]) * SizeOf(Single));
end;
Anatoly Podgoretsky (2006-08-24 13:29:00) [5]Length(pArr1^) * Length(pArr1^[0]) * SizeOf(Single)???
DprYg (2006-08-24 13:00:00) [6]
> Начинающий_1
В справке написано все про динамические массивы(и про то что это собственно такое, и про их сравнение, и копирование, и про передачу в подпрограммы). Почему бы не прочитать?
guav (2006-08-24 12:54:00) [7]> Move(@SrcDynArray[0], @DstDynArray[0], Length(SrcDynArray)
> )
Никогда не делать так для дву- и более- мерных динамических массивов.
И для массивов содержащих интерфейсы, варианты и ansi строки.
Кроме того учтён размер элемента.
И вообще делать подобное не стоит.
Дин массивы копируются через Copy.
MBo (2006-08-24 12:51:00) [8]>А как исправить это
Ни к чему вводить тип указателей на дин. массивы
Сергей М. (2006-08-24 12:51:00) [9]
> А как исправить это
>
function CompareArrays(const pArr1, pArr2: PDblSingleArr): Boolean;
begin
Result := Length(pArr1^) = Length(pArr2^);
if Result then
Result:=CompareMem(@pArr1[0], @pArr2[0], Length(pArr1^)* SizeOf(Single));
end;
> После этой операции SrcDynArray еще будет существовать ?
Конечно. Куда он денется)
Начинающий_1 (2006-08-24 12:43:00) [10]Спасибо
>В том что ни pArr1^ ни pArr2^ не указывают на собственно данные >массивов.
А как исправить это исправить ?
>Move(@SrcDynArray[0], @DstDynArray[0], Length(SrcDynArray))
После этой операции SrcDynArray еще будет существовать ?
Сергей М. (2006-08-24 12:37:00) [11]
> В чем ошибка ?
В том что ни pArr1^ ни pArr2^ не указывают на собственно данные массивов.
> Как скопировать один массив в другой ?
Move(@SrcDynArray[0], @DstDynArray[0], Length(SrcDynArray))