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

Вниз

Сравнить 2 record а   Найти похожие ветки 

 
TButton ©   (2004-03-29 17:21) [0]

сабж. есть массив record"ов и один record, который ищем в массиве.

function HasItemInBase(it: TItem): boolean;
var
 i: integer;
begin
 result:=false;
 if high(base)=-1 then exit;
 for i:=0 to high(base) do
   if base[i]=it then
   begin
     result:=true;
     Exit;
   end;
end;

компилятор тыкает меня носом в выделеную строчку и говорит
[Error] Unit1.pas(87): Incompatible types


 
TButton ©   (2004-03-29 17:22) [1]

а сравнивать каждое поле - в лом. полей там достаточно.


 
Digitman ©   (2004-03-29 17:27) [2]


> в лом


а мне вот тоже "в лом" спрашивать тебя о том, как декларирован массив


 
Reindeer Moss Eater ©   (2004-03-29 17:31) [3]

CompareMem


 
TButton ©   (2004-03-29 17:34) [4]

[2]
виноват. исправлюсь.

base: array of TItem;


хотя мне это казалось очевидным.


 
Reindeer Moss Eater ©   (2004-03-29 17:36) [5]

хотя мне это казалось очевидным.

Наверное декларация самого типа TItem для всех тоже очевидна?


 
Reindeer Moss Eater ©   (2004-03-29 17:38) [6]

Хотя разницы вообще нет.
Ни как объявлен рекорд. Ни как объявлен TItem.
СоmpareMem даст ответ.


 
TButton ©   (2004-03-29 17:41) [7]

re 5
мож тогда сразу весь исходник кинуть? я думал что метод сравнения двух рекордов (одинаковых) не зависит от их декларации.

re 3, 6
счас попробуем.


 
Digitman ©   (2004-03-29 17:42) [8]


> хотя мне это казалось очевидным


с чего бы "очевидным" ?

а мне, к примеру, очевидней было бы

array[0..N] of TItem

но и в том и ином случае без CompareMem не обойтись


 
Digitman ©   (2004-03-29 17:46) [9]


> метод сравнения двух рекордов (одинаковых) не зависит от
> их декларации.


очень даже зависит

но в дан.случае речь о "методе сравнения" вовсе не идет
ты просто пытаешься перевалить на компилятор то, что он не вправе делать, как напротив равно и то что есть твоя обязанность


 
TButton ©   (2004-03-29 17:47) [10]

>но и в том и ином случае без CompareMem не обойтись
я не буду это комментировать. я просто спрошу, а нельзя было это сразу сказать? или просто по приколу меня по спрашивать? в любом случае, всем спасибо.


 
TButton ©   (2004-03-29 17:49) [11]

re 9
типа сам заварил кашу, сам и расхлебывай? сразу вспоминается афоризм "ничто так не ограничивает полет мысли программиста, как компилятор"


 
Digitman ©   (2004-03-29 17:51) [12]


> TButton


смотри только не врюхайся с CompareMem в случае если хотя бы одно поле стр-ры содержит указатель


 
TButton ©   (2004-03-29 17:54) [13]

re 12
ну что вы =) для меня указатели - темный лес. серьезно, я ими почти не пользовался/пользуюсь, т.е. до тех пор пока нужда не заставит.


 
Digitman ©   (2004-03-29 17:57) [14]


> TButton


надо понимать, и AnsiString не используешь ?!
Это ж мазохизм натуральный)


 
TButton ©   (2004-03-29 18:08) [15]

а что такое AnsiString? серьезно.


 
Digitman ©   (2004-03-29 18:15) [16]

AnsiString, also called a long string, represents a dynamically allocated string whose maximum length is limited only by available memory. It uses 8-bit ANSI characters.
A long-string variable is a pointer occupying four bytes of memory. When the variable is empty—that is, when it contains a zero-length string—the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points to a dynamically allocated block of memory that contains the string value, a 32-bit length indicator, and a 32-bit reference count. This memory is allocated on the heap, but its management is entirely automatic and requires no user code.

Because long-string variables are pointers, two or more of them can reference the same value without consuming additional memory. The compiler exploits this to conserve resources and execute assignments faster. Whenever a long-string variable is destroyed or assigned a new value, the reference count of the old string (the variable’s previous value) is decremented and the reference count of the new value (if there is one) is incremented; if the reference count of a string reaches zero, its memory is deallocated. This process is called reference-counting. When indexing is used to change the value of a single character in a string, a copy of the string is made if—but only if—its reference count is greater than one. This is called copy-on-write semantics.


 
Digitman ©   (2004-03-29 18:19) [17]

по-русски "на огурцах" - тот самый тип String, который ты используешь повседневно, не задумываясь о том, что этот тип данных из себя представляет


 
Тимохов ©   (2004-03-29 18:22) [18]

ручками сравнивать каждое поле
лом на помойку

либо comparemem, но тогда про длинные строки и про указатели почитать


 
han_malign ©   (2004-03-29 18:24) [19]

>two or more of them can reference the same value without consuming additional memory
- кстати, с ShortString гораздо более вероятно наколоться, т.к. не факт, что очищены неиспользуемые символы, CompareMem даст различие на одинаковых строках...


 
Verg ©   (2004-03-29 18:51) [20]


> han_malign ©   (29.03.04 18:24) [19]
> >two or more of them can reference the same value without
> consuming additional memory
> - кстати, с ShortString гораздо более вероятно наколоться,
> т.к. не факт, что очищены неиспользуемые символы, CompareMem
> даст различие на одинаковых строках...


Это одна из причин, почему кмпилятор не допускает сравнение струтурных данных.
Есть еще и record field alignment - какой уж тут comparemem....


 
Defunct ©   (2004-03-29 19:47) [21]

Свою функцию сравнения написать, будет наиболее быстрым решением. Некоторые поля можно опустить.


 
Defunct ©   (2004-03-29 19:49) [22]

Зы, CompareMem может облажаться, если рекорд неупакованный.


 
TButton ©   (2004-03-29 19:56) [23]

ну пока CompareMem не подводит
а на будущее - думаю сделать поле ID и по нему сравнивать.


 
Defunct ©   (2004-03-29 20:02) [24]

Еще лучше поля: Id и CheckSum когда сравнений много, и сравниваются большие блоки памяти. Заметно ускорит работу. А в случае совпадения контрольных сумм, провести уже тщательное (побайтовое) сравнение.


 
TButton ©   (2004-03-29 20:07) [25]

да нет. итемы лицензионные, будут снабжаться ИД, система не позволяет импортировать одну и ту же итему, поскольку используемые ID знаю только я, это очень затруднит кустарное производство и использование итемов.



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

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

Наверх




Память: 0.53 MB
Время: 0.058 c
7-1076620965
salex
2004-02-13 00:22
2004.04.18
Чтение HDD SMART


1-1080412965
Veon
2004-03-27 21:42
2004.04.18
Как создать форму????


14-1080208303
Тумар
2004-03-25 12:51
2004.04.18
Принтеры Canon i250 -i350 можно ли их заправлять?


14-1080226538
ЕвроКар
2004-03-25 17:55
2004.04.18
Вопрос по интергации с IE


3-1079531549
Vanoid
2004-03-17 16:52
2004.04.18
Офигеете: отмена выполнения асинхронных запросов ADOQuery. MSSQL