Текущий архив: 2002.06.13;
Скачать: CL | DM;
Вниз
Считывание данных из файла Найти похожие ветки
← →
viko (2002-06-03 03:36) [0]Здравствуйте ! У меня вот такой вопрос.
На шестом Паскале под ДОС написана прога которая создает на диске типизированный файл и записывает в него переменные (текст ниже). На делфи 1.6 данные удается вытащить без проблем, а на пятой ну ни как. Может что с кодировкой ДОС или с разным форматом описания переменных в делфи в отличии от паскаля. Я уже испробовал все, ничего не получается.Кто сможет помогите , очень нужно. Заранее благодарен.
type
str80=string[80];
str8=string[8];
g30=array[1..30]of integer;
mas41=array[1..41] of real;
imas41=array[1..41] of integer;
r24=array[0..23]of real;
i24=array[0..23]of integer;
type zapstk=record
zwr_re:byte;
zmashtabk:real;
zmaxm:real;
zttstart,zfl:str8;
ztssec:longint;
zktp,zkolminut:integer;
zplase:str80;
zwkua,zwkub,zwkuc,zwkia,zwkib,zwkic,zkolfaz:byte;
zktn,zktt,zunf:real;
zinterval:integer;
zhtek,zmtek,ztsh,ztsm,zsyear,zsmonht,zsday,
zend_year,zend_month,zend_day:word;
zsum_izm:integer;
zmodua,zmodub,zmoduc,zckdua,zckdub,zckduc,zmodu1p,
zckdu1p,zmok2p,zmok0p,zckk2p,zckk0p,
zmoknca,zmokncb,zmokncc,zckknca,zckkncb,zckkncc:real;
zgknca,zgkncb,zgkncc,zgk0p,zgk2p,zgdu1p:g30;
zsuavp,zsubvp,zsucvp,zsquavp,zsqubvp,zsqucvp:mas41;
zd1upl,zd1umi,zd2upl,zd2umi:real;
zsd1akns,zsd2akns,zsd1bkns,zsd2bkns,zsd1ckns,zsd2ckns,
zsd1k0,zsd2k0,zsd1k2,zsd2k2,zsd1du1p,zsd2du1p:integer;
zsd2ga,zsd2gb,zsd2gc:imas41;
zkns_lt,zkns_rt,zk2_lt,zk2_rt,
zk0_lt,zk0_rt,zdu_lt,zdu_rt:integer;
zdu_24,zkns_24,zk2_24,zk0_24:r24;
zt_24:i24;
end;
var
fstk:file of zapstk;
zs:zapstk;
← →
MBo (2002-06-03 06:45) [1]В delphi5 Integer занимает 4 байта, а в TP и Delphi1 - 2.
Используй вместо Integer в D5 SmallInt - аналог TP-Integer.
Кроме того, Real был 6-байтовый, теперь по умолчанию 8.
Используй Real48.
← →
Anatoly Podgoretsky (2002-06-03 10:25) [2]И еще вот это
type zapstk=record
первое type здесь лишнее, не ошибка но все таки
втора проблема выравнивание, может поможет
zapstk= packed record
но может и нет, тогда придется бороться ы сврывнивание на контрольных записях, а все началось с бардака в голове у программиста, который решил использовать generic типы, вместо fundamental и понятия не имеет о выравнивании.
← →
PVOzerski (2002-06-03 11:33) [3]1) record переправляем на packed record;
2) integer меняем на smallint;
3) надо бы как-то прочесть real 6-битный... Вот этого не делал. Нашел специально для Вас
в Сети описание внутреннего представления real и double, вот и колдуйте.
Вещественный тип
Шестибайтовое (48-битовое) вещественное число (Real) подраз-
деляется на три поля:
1 39 8
+---+------..-------+--------+
| s | f | e |
+---+------..-------+--------+
msb lsb msb lsb
Значение v числа определяется с помощью выражений:
if 0 < e <= 255, then v = (-1)^s * 2^(e-129)*(l.f).
if e = 0, then v = 0.
Вещественный тип не может использоваться для хранения ненор-
мализованных чисел, значений, не являющихся числом (NaN), а также
бесконечно малых и бесконечно больших значений. Ненормализованное
число при сохранении его в виде вещественного принимает нулевое
значение, а не числа, бесконечно малые и бесконечно большие зна-
чения при попытке использовать для их записи формат вещественного
числа приводят к ошибке переполнения.
Здесь и далее msb означает более значащий бит (старшие раз-
ряды), lsb - менее значащий (младшие разряды).
Тип числа с двойной точностью
Восьмибайтовое (64-битовое) число типа Double подразделяется
на три поля:
1 11 52
+---+------+-------..--------+
| s | e | f |
+---+------+-------..--------+
msb lsb msb lsb
Значение v этого числа определяется с помощью выражений:
if 0 < e < 2047, then v = (-1)^s * 2^(e-1023) * (l.f).
if e = 0 and f <> 0, then v = (-1)^s * 2^(1022) * (o.f).
if e = 0 and f = 0, then v = (-1)^s * O.
if e = 2047 and f = 0, then v = (-1)^s * Inf.
if e = 2047 and f <> 0, then v = NaN.
← →
MBo (2002-06-03 11:36) [4]>real 6-битный
А чего колдовать - Real48
Страницы: 1 вся ветка
Текущий архив: 2002.06.13;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.004 c