Тута решил написать програмку, дабы потестить это
- Код: Выделить всё
{$MODE OBJFPC}
type
trec = record
af,bf: Smallint;
end;
procedure getab(rec: trec; var a,b);
begin
//Smallint(a) := rec.af; Smallint(b) := rec.bf
Longint(a) := rec.af; Longint(b) := rec.bf
end;
procedure check_byte(tst: trec);
var
ta: Byte = 0;
tb: Byte = 0;
begin
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_word(tst: trec);
var
ta: Word = 0;
tb: Word = 0;
begin
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ' ');
ta := 65535; tb := 65535;
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_sint(tst: trec);
var
ta: Smallint = 0;
tb: Smallint = 0;
begin
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ' ');
ta := -32768; tb := 32767;
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_lint(tst: trec);
var
ta: Longint = 0;
tb: Longint = 0;
begin
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ' ');
ta := -32768; tb := 32767;
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ' ');
ta := -2147483648; tb := 2147483647;
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ';');
end;
procedure check_lword(tst: trec);
var
ta: Longword = 0;
tb: Longword = 0;
begin
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ' ');
ta := -32768; tb := 32767;
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ' ');
ta := 4294967295; tb := 4294967295;
getab(tst,ta,tb);
write((ta = tst.af) AND (tb = tst.bf), ';');
end;
Type
TCheckt = procedure(tst: trec);
const
tst: array[0..6] of trec =
(
(af:0;bf:0),
(af:1;bf:3),
(af:-3;bf:-1),
(af:2047;bf:2047),
(af:-2048;bf:-2048),
(af:32767;bf:32767),
(af:-32768;bf:-32768)
);
var
i: Longint;
cfn: TCheckt;
begin
writeln('Byte:');
cfn := @check_byte;
for i := 0 to 6 do
cfn(tst[i]);
writeln;
writeln('Word:');
cfn := @check_word;
for i := 0 to 6 do
cfn(tst[i]);
writeln;
writeln('Smallint:');
cfn := @check_sint;
for i := 0 to 6 do
cfn(tst[i]);
writeln;
writeln('Longint:');
cfn := @check_lint;
for i := 0 to 6 do
cfn(tst[i]);
writeln;
writeln('Longword:');
cfn := @check_word;
for i := 0 to 6 do
cfn(tst[i]);
writeln;
end.
Ее вывод
- Код: Выделить всё
Byte:
TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;
Word:
TRUE TRUE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;
Smallint:
TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;TRUE TRUE;
Longint:
TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;TRUE TRUE TRUE;
Longword:
TRUE TRUE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;TRUE TRUE;FALSE FALSE;
Вроде все правильно, ошибки если record поля больше тестируемых переменных, а также если поля отрицательные, в то время как переменные беззнаковые.
если в коде поменять:
procedure getab(rec: trec; var a,b);
begin
//Smallint(a) := rec.af; Smallint(b) := rec.bf
Longint(a) := rec.af; Longint(b) := rec.bf
end;
на
procedure getab(rec: trec; var a,b);
begin
Smallint(a) := rec.af; Smallint(b) := rec.bf
//Longint(a) := rec.af; Longint(b) := rec.bf
end;
Получаются явные ошибки, если переменные инициализированы не нулевыми значениями, то есть остается мусор.
Прошу прощения за длинный код, он вообще то не сложный, пускай это будет ответом тем, кто предлагает использовать перегрузку, тем более, что что потребности в этом нет.