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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
4-1152387273
Hendalph
2006-07-08 23:34
2006.12.10
Надо скрыть приложение ихз списка процессов


15-1164221198
Beavercrazy
2006-11-22 21:46
2006.12.10
Если сделать полностью Flash сайт?


6-1153442710
Glu
2006-07-21 04:45
2006.12.10
Не одно подключение


2-1164375225
SergeyP
2006-11-24 16:33
2006.12.10
Как проиграть mailbeep?


2-1164126737
Kolan
2006-11-21 19:32
2006.12.10
Где правильно хранить настройки/файлы программы?