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

Вниз

Сравнить 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.033 c
14-1079961774
RealRascal
2004-03-22 16:22
2004.04.18
Определить габариты текста на форме


1-1080732673
СержК
2004-03-31 15:31
2004.04.18
Синхронизация системного времени


1-1080977714
Arturchik
2004-04-03 11:35
2004.04.18
Как вычесть TSystemTime из TSystemTime и получить разницу...


8-1073117096
Evgeniy_K
2004-01-03 11:04
2004.04.18
Размер файла картинки после сохранения


14-1080214113
Kerk
2004-03-25 14:28
2004.04.18
Подскажите конфигурацию





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