Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
ВнизСравнение двумерных динамических массивов Найти похожие ветки
← →
Начинающий_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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.05 c