Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Сравнение двумерных динамических массивов   Найти похожие ветки 

 
Начинающий_1   (2006-08-24 12:33) [0]

Пытаюсь сравнивать два массива.
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;

И, соответственно, возникает еще вопрос: Как скопировать один массив в другой ?


 
Сергей М. ©   (2006-08-24 12:37) [1]


> В чем ошибка ?


В том что ни pArr1^ ни pArr2^ не указывают на собственно данные массивов.


> Как скопировать один массив в другой ?


Move(@SrcDynArray[0], @DstDynArray[0], Length(SrcDynArray))


 
Начинающий_1   (2006-08-24 12:43) [2]

Спасибо
>В том что ни pArr1^ ни pArr2^ не указывают на собственно данные >массивов.
А как исправить это исправить ?

>Move(@SrcDynArray[0], @DstDynArray[0], Length(SrcDynArray))
После этой операции SrcDynArray еще будет существовать ?


 
MBo ©   (2006-08-24 12:51) [3]

>А как исправить это
Ни к чему вводить тип указателей на дин. массивы


 
Сергей М. ©   (2006-08-24 12:51) [4]


> А как исправить это
>


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 еще будет существовать ?


Конечно. Куда он денется)


 
guav ©   (2006-08-24 12:54) [5]

> Move(@SrcDynArray[0], @DstDynArray[0], Length(SrcDynArray)
> )

Никогда не делать так для дву- и более- мерных динамических массивов.
И для массивов содержащих интерфейсы, варианты и ansi строки.
Кроме того учтён размер элемента.
И вообще делать подобное не стоит.

Дин массивы копируются через Copy.


 
DprYg ©   (2006-08-24 13:00) [6]


> Начинающий_1

В справке написано все про динамические массивы(и про то что это собственно такое, и про их сравнение, и копирование, и про передачу в подпрограммы). Почему бы не прочитать?


 
Anatoly Podgoretsky ©   (2006-08-24 13:29) [7]

Length(pArr1^) * Length(pArr1^[0]) * SizeOf(Single)???


 
Начинающий_1   (2006-08-24 13:49) [8]

>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;


 
Сергей М. ©   (2006-08-24 13:54) [9]


> Начинающий_1   (24.08.06 13:49) [8]


И сравнивать многомерные массивы нельзя таким способом.


 
guav ©   (2006-08-24 13:58) [10]

> Если использовать закоментированный код, то все работает,
> иначе - нет.

Это нормально.


> CompareMem(@pArr1[0, 0], @pArr2[0, 0], Length(pArr1) * Length(pArr1[0])
> * SizeOf(Single));

Это и не будет работать для двумерного дин. массива.
Двумерный массив представляет собой одномергый массив из одномерных массивов. Переменная типа дин массив - это ссылка на некоторыю структуру, которая содержит данные массива по неотрицательным смещениям.
Т.е. использования CompareMem подойдёт только для самой внутренней размерности, для остальных приходится использовать цикл. То же самое и при копировании через Copy.


 
Начинающий_1   (2006-08-24 14:06) [11]

Спасибо



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
15-1156999845
V-A-V
2006-08-31 08:50
2006.09.17
Сервис пак для Delphi 6


1-1154624425
ISK(CMEPTb)
2006-08-03 21:00
2006.09.17
Вставка объектов в текстовый редактор


1-1154291770
UnKnownPeople
2006-07-31 00:36
2006.09.17
Подскажите - как в Delphi работать с WEB-камерой?


2-1156984662
ph0sgen
2006-08-31 04:37
2006.09.17
Вопрос по DLL


8-1141121155
iss
2006-02-28 13:05
2006.09.17
изменение размера image