Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1156999845
V-A-V
2006-08-31 08:50
2006.09.17
Сервис пак для Delphi 6


2-1156403821
moor38
2006-08-24 11:17
2006.09.17
Как зная координаты ячейки в StringGrid узнать цвет ячейки?


15-1156521942
hamster
2006-08-25 20:05
2006.09.17
Упакованные exe


15-1156235492
buka
2006-08-22 12:31
2006.09.17
Ася, шрифты, ворд...


2-1156495297
Чапаев
2006-08-25 12:41
2006.09.17
SizeOf(C++ enum)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский