Форум: "Начинающим";
Текущий архив: 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