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

Вниз

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

 
Очень Злой   (2011-10-03 11:38) [0]

Вроде как читал что масивы сравнивать нельзя.
Но на такое компилятор не ругается.

Type TmyArray: packed array[1..8] of byte;
...

var
  a,b:TMyArray;
begin
 ...
 if a=b then ...


Что сравнивается в этом случае? Указатели?

Или это зависит от версии Delphi? У меня D7

Или все-таки лучше сравнивать используя comparemem?


 
Медвежонок Пятачок ©   (2011-10-03 11:48) [1]

сравниваются адреса первых элементов


 
Rouse_ ©   (2011-10-03 11:53) [2]

В данном случае можно через CompareMem()


 
Rouse_ ©   (2011-10-03 12:00) [3]


> Но на такое компилятор не ругается.
>
> Type TmyArray: packed array[1..8] of byte;

вот именно на такое, ругается, не будет ругаться на вот такое.
Type
 TmyArray = packed array of byte;

и в данном случае, т.к. массив будет динамический, то будут сравниваться указатели, а не адреса первых элементов, т.е. вот такой код:

Type
 TmyArray = packed array of byte;

procedure TForm1.FormCreate(Sender: TObject);
var
 a,b: TMyArray;
begin
 SetLength(A, 3);
 SetLength(B, 3);
 a[1] := 1;
 B[1] := 1;
 if a <> b then
   ShowMessage("False");


высветит False.

Если же массив будет обьявлен как статический: .т.е.
Type
 TmyArray = packed array [1..8] of byte;


то вот этот код компилятор не пропустит:

if a=b then ...


 
Очень Злой   (2011-10-03 12:12) [4]

type Tpassline = packed array[1..8] of char;
...
procedure aa;
var
a,b:Tpassline;
begin
if a=b then
begin
//
end;
end;


Вот это у меня компилятор пропускает....


 
DiamondShark ©   (2011-10-03 12:59) [5]


> Очень Злой   (03.10.11 12:12) [4]
> Вот это у меня компилятор пропускает....

CPU Window -- нашефсё!

Unit1.pas.17: if a=b then
0044CD9B 8BC4                mov eax,esp
0044CD9D 8D542408         lea edx,[esp+$08]
0044CDA1 B908000000      mov ecx,$00000008
0044CDA6 E89D5FFBFF      call @AStrCmp

procedure       _AStrCmp;
asm
{     ->EAX = Pointer to left string    }
{       EDX = Pointer to right string   }
{       ECX = Number of chars to compare}


Т.е. он сравнивает как строки, что неудивительно, если вспомнить, что packed array of char по доброй борландовской традиции прозрачно преобразуется в строки.

Если поменять описание типа на
type Tpassline = packed array[1..8] of byte;
то закономерно получим:
[Error] Unit1.pas(17): Operator not applicable to this operand type

В первом случае вас спасло неявное компилер-маджик преобразование типов.


 
Rouse_ ©   (2011-10-03 13:09) [6]


> Очень Злой   (03.10.11 12:12) [4]
> Вот это у меня компилятор пропускает....

ну так тип же другой, массив чаров а не байт, тут уже работа как с ShortString идет через WStrLComp/AStrComp


 
Rouse_ ©   (2011-10-03 13:10) [7]

Хм, чего-то саообщения Шарка не видел перед ответом... Ну да ладно...


 
Очень Злой   (2011-10-03 13:29) [8]

т.е. массивы типа packed array[1..8] of byte можно без проблем сравнивать?
а то я уже через CompareMem написал....

Может их еще можно копировать через a:=b?
а то пока через Move пишу (на всякий случай)...


 
Rouse_ ©   (2011-10-03 13:32) [9]


> Может их еще можно копировать через a:=b?

Можно...


 
Rouse_ ©   (2011-10-03 13:32) [10]

Но только статические однотипные.


 
Dennis I. Komarov ©   (2011-10-03 13:46) [11]


> а то пока через Move пишу

Пиши, меньше граблями получишь. Так можно делать когда понимаешь (и представляешь) как в памяти "компа" это аккуратно складывается...
Кроме того, операции с памятью нагляднее и читабельнее.


 
Сергей М. ©   (2011-10-03 14:03) [12]

> массивы типа packed array[1..8] of byte можно без проблем сравнивать?

IsEqual := PInt64(@a)^ = PInt64(@b)^


 
Очень Злой   (2011-10-03 14:52) [13]


> IsEqual := PInt64(@a)^ = PInt64(@b)^


Была подобная мысль...
Вернее думал сделать так:

Type MyRec= packed record of
      case boolean of
      true: (MyArray:packed array[1..8] of byte);
      false: (ForCompare: int64);
      end;

Но теперь решил обойтись array[1..8] of Char...


 
Anatoly Podgoretsky ©   (2011-10-03 19:09) [14]


> Что сравнивается в этом случае? Указатели?

В данном случае сравниваются переменные а и в



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1317566758
Reist
2011-10-02 18:45
2012.01.08
This form of method call only allowed for class methods


2-1317060263
Псарь
2011-09-26 22:04
2012.01.08
Знак минимизации окна.


15-1316516688
KSergey
2011-09-20 15:04
2012.01.08
Как организована продажа игровых артефакт, "вирт. валюты сайтов"


15-1315302753
Pit
2011-09-06 13:52
2012.01.08
Особенности отображения сайтоа на iPhone


15-1316204983
Юрий
2011-09-17 00:29
2012.01.08
С днем рождения ! 17 сентября 2011 суббота