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

Вниз

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

 
SergP ©   (2006-11-19 13:31) [0]

Толи лыжи не едут, толи я чего-то не понимаю, вобщем:

...
type Factor = packed record
      Num:byte;
      Position:byte;
    end;
...
var
...
 Mas:array[1..5040] of record
     Num:word;
     Str:string[4];
     f: array[1..4] of Factor;
     end;
...
procedure TForm1.Button4Click(Sender: TObject);
var
 i:integer;
 x1,x2:Factor;
begin
...
 for i:=1 to 5040 do
 begin
  if (mas[i].f[1]=x1) and (mas[i].f[2]=x2) then
...
 end;
end;
...


Вот на строку с if (mas[i].f[1]=x1) and (mas[i].f[2]=x2) then
ругается такой руганью

[Error] Unit1.pas(141): Incompatible types
[Error] Unit1.pas(141): Incompatible types

С чего это Дельфе показалось что несоответствие типов?

PS Странно... Что-то я раньше почему-то не натыкался на такие приколы...


 
Anatoly Podgoretsky ©   (2006-11-19 13:34) [1]

> SergP  (19.11.2006 13:31:00)  [0]

Не уверен, что приведен достаточный код.


 
SergP ©   (2006-11-19 13:42) [2]

Вот. поэкспериментировал... Это полный код:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

 type Factor = packed record
      Num:byte;
      Position:byte;
    end;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 a,b:Factor;
begin
 if a=b then exit;
end;

end.


Ошибка та же самая... несоответствие типов...
Записи что-ли на Дельфе сравнивать нельзя?


 
Anatoly Podgoretsky ©   (2006-11-19 13:47) [3]

> SergP  (19.11.2006 13:42:02)  [2]

Вот теперь приведенный код позволяет сделать диагноз.
Убери второй type


 
Anatoly Podgoretsky ©   (2006-11-19 13:49) [4]

> SergP  (19.11.2006 13:42:02)  [2]

Ой, только что заметил, ты же записи пытаешься сравнивать, а надо члены.


 
guav ©   (2006-11-19 14:42) [5]

Так записи сравнивать нельзя.
Пищи явно сравнение по полям.

Думаю это связано с трудностями реализации для не packed записей, и записей с вариантными частями. RTTI вроде есть только для записей с long strings, dyn arrays, variants, interfaces. О полях byte RTL не знает.


 
Eraser ©   (2006-11-19 14:48) [6]

> [5] guav ©   (19.11.06 14:42)

ну в принципе можно, с пом. CompareMemory например, но средствами языка конечно нельзя.


 
guav ©   (2006-11-19 14:50) [7]

> [6] Eraser ©   (19.11.06 14:48)
> ну в принципе можно, с пом. CompareMemory например

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


 
Anatoly Podgoretsky ©   (2006-11-19 14:54) [8]

> Eraser  (19.11.2006 14:48:06)  [6]

Ага, очень интерсна будет такая проверка для динамических структур.


 
Eraser ©   (2006-11-19 14:56) [9]

> [7] guav ©   (19.11.06 14:50)

ну именно по-этому и нет встроенной возможности сравнивать записи, но в частных случаях, когда, допустим, имеется запись без вариантной части с огромным количесвом полей и нужно сравнить её на равно/не равно, то проще оформить запись в соответствии с выравниванием (или вообще как упакованую) и сравнивать CompareMemory, чем писать код, где сравнивается последовательно каждое поле.


 
Eraser ©   (2006-11-19 14:56) [10]

> [8] Anatoly Podgoretsky ©   (19.11.06 14:54)

а нечего в записи указатели пихать :)


 
SergP ©   (2006-11-19 16:31) [11]

> [9] Eraser ©   (19.11.06 14:56)
> > [7] guav ©   (19.11.06 14:50)
>
> ну именно по-этому и нет встроенной возможности сравнивать
> записи,


а в принципе могли бы и сделать для packed record которые не содержат динамических структур...

Впрочем пока обошелся добавлением вариантного поля...


 
Anatoly Podgoretsky ©   (2006-11-19 17:31) [12]

> SergP  (19.11.2006 16:31:11)  [11]

Ты представляешь как это будет выглядеть?

Тут играем, тут не играем, а тут рыба лежала.


 
SergP ©   (2006-11-19 19:48) [13]

> [12] Anatoly Podgoretsky ©   (19.11.06 17:31)
> > SergP  (19.11.2006 16:31:11)  [11]
>
> Ты представляешь как это будет выглядеть?


Да.



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

Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.046 c
2-1164165854
lobach
2006-11-22 06:24
2006.12.10
Как узнать какой пункт ListBox а сейчас выбран?


3-1160041068
Kolan
2006-10-05 13:37
2006.12.10
Проектирование иерархической БД.


2-1164113604
IGo
2006-11-21 15:53
2006.12.10
Delphi Количество страниц в Word е


1-1162125303
Shadow_exe
2006-10-29 15:35
2006.12.10
Indy


2-1164319075
Draught
2006-11-24 00:57
2006.12.10
При старте приложения показываются все формы





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