Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
Очень Злой   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.003 c
1-1279098114
packpaul
2010-07-14 13:01
2012.01.08
Реализация null-методов класса в Delphi


2-1317233178
Очень злой
2011-09-28 22:06
2012.01.08
Можно ли сравнивать типизированные указатели разных типов?


2-1317112841
lesstab
2011-09-27 12:40
2012.01.08
OnDataChange - хитрость. Не грех ли?


2-1317495602
Leon-Z
2011-10-01 23:00
2012.01.08
Соединение с БД MySQL.


1-1279348911
set
2010-07-17 10:41
2012.01.08
Сообщение виндовс ХР





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский