Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Типы файлов - переход от Паскаля к Дельфи


Автор: bagira 24.1.2004, 01:41
Ситуация такая: в течение нескольких лет происходит сбор данных некоторых технологических процессов с большого количества установок. Программы, разработанные мной в DOS Turbo Pascal 7, условно делятся на две группы: 1-сбор данных, 2 - обработка данных. После программы сбора данных происходит добавление записей в файлы (тип файла и структура записи - см. ниже). Программа математической обработки запускается пользователем позднее, выборочно, и, может быть, касается не всех созданных файлов.

Вот так описывается структура записи в Паскале (в старой программе):
---------
Код
type
    t0=array[1..200] of word;
    t7=array[1..10] of real;
    t8=array[1..10] of integer;


    t4=record
       name:String[5];
       smen:String[1];
       ust:Integer;
       kanal:Integer;
       rabo:String[2];
       zadan:t7;
       izmen:t8;
       cht:Integer;
       xt:t0;
    end;

Izd: t4;
Fp: file of t4;
---------------

Осуществляется переход к программам для Windows, которые я разрабатываю в Delphi 5.

Задача такая - организовать так называемый "переходный" период, когда действует и старая система, и также постепенно разрабатываются элементы новой. Т.е. нужно "научить" новую программу обработки понимать формат старых файлов с измерениями, "приспособить новое под старое".

Таких файлов с измерениями - десятки тысяч, записанных за несколько лет, и нет смысла менять структуру их самих. ФАЙЛЫ МЕНЯТЬ НЕЛЬЗЯ.

Мои действия по порядку:

1. Напрямую перенесла описания типов и переменных в новую программу. Структура файла распознается неверно.

2. Вместо String - везде пишу ShortString с заданием соответствующей длины строк SetLength. Нет результата.

3. Вместо Integer - SmallInt. Результат тот же.

4. Вместо Real - Real48. Не помогает.
5. Также безнадежны попытки приспособить и тип AnsiString.

6. Объявляю name:String[6], из структуры убираю Smen, а соответствующее значение пытаюсь получить как Copy(Izd.Name,6,1), но и это не помогает.

Проверка проводилась путем считывания первой записи из одного конкретного файла, содержимое которого известно заранее. Ни в одном случае правильно не определялась ни одна переменная, кроме первой (String[5]). Вторая Izd.Smen - пустая: "".

Не понимаю, почему такая несовместимость?! Может быть, уважаемые дельфисты подскажут что-нибудь?

Автор: Vit 24.1.2004, 02:11
Код
type
   t0=array[1..200] of word; не должно быть различий
   t7=array[1..10] of Single; ?? Не уверен, нет под рукой паскаля проверить...
   t8=array[1..10] of Smallint; Совершенно уверен что надо так менять


   t4=record
      name:String[5];не должно быть различий
      smen:String[1];не должно быть различий
      ust:Smallint;Совершенно уверен что надо так менять
      kanal:Smallint;Совершенно уверен что надо так менять
      rabo:String[2];не должно быть различий
      zadan:t7;не должно быть различий
      izmen:t8;не должно быть различий
      cht:Smallint;Совершенно уверен что надо так менять
      xt:t0;не должно быть различий
   end;

Izd: t4;не должно быть различий
Fp: file of t4;не должно быть различий

Автор: Vit 24.1.2004, 02:14
Если не получится, скажи, я тряхну стариной, установлю себе TP и попробую выяснить...

Автор: bagira 24.1.2004, 02:24
Спасибо, Vit!

Итак - SmallInt оставляю, а вот со String[5] и String[1] все не просто. После первого элемента - как бы провал, пустая строка, хотя там точно должен быть символ...

Насчет Single - проверю завтра по книге.

Автор: dm9 24.1.2004, 02:27
Насчёт Real
Читаем в Фаронове: Если хотим использовать старый Real, который был в Delphi 1-3, включаем директивку {$REALCOMPATIBILITY ON}.

Попробуй оставить String-и как были.

В общем, я бы написал так:

Код
---------
{$REALCOMPATIBILITY ON}
type
t0=array[1..200] of word;
t7=array[1..10] of Real;
t8=array[1..10] of SmallInt;


t4=record
name:String[5];
smen:String[1];
ust:SmallInt;
kanal:SmallInt;
rabo:String[2];
zadan:t7;
izmen:t8;
cht:SmallInt;
xt:t0;
end;

Izd: t4;
Fp: file of t4;
---------------

Автор: dm9 24.1.2004, 02:34
bagira, если ты прочитала мой старый вариант предыдущего сообщения, забудь об этом бреде... Я исправил. Говорю это, так как ты сейчас в форуме и могла увидеть, что там было написано... Мне надо быть внимательнее...

Автор: bagira 24.1.2004, 02:34
Dm9, спасибо, проверю оба варианта... Но, по-моему, наибольшая проблема - именно в String, так как не читается уже сразу после первого элемента в начале файла.


Автор: <Spawn> 24.1.2004, 06:54
А может нужно сделать packed record? Хотя я не знаю какие записи были в Паскале(может они там по умолчанию упакованые)

Автор: Paradox 24.1.2004, 07:04
Код
String[1]
имеет ли смысл ? может char попробовать
К тому же по-моему переменная типа стринг занимает минимум два байта, может в этом проблема
А может я и не прав

Автор: <Spawn> 24.1.2004, 07:55
Paradox Да два байта, причем не важно какая это string - паскалевская, с первым байтом указывающим размер строки или указатель на строку с null-terminated окончанием(В зависимости от $H+/$H-).

to bagira : я вот еще что думаю, попробуй функцией sizeof сравнить размер структуры в паскале и в Дельфе, чтобы посмотреть на сколько байтиков они различаются.

Автор: December 24.1.2004, 15:26
bagira
если структура везде одна и та же, не проще ли сделать процедуру-адаптер через fileRead, fileWrite?

Автор: p0s0l 24.1.2004, 16:53
Bagira, тебе осталось соединить вместе высказанные советы:
integer->smallint
real->real48 (или {$REALCOMPATIBILITY ON})
word, string - без изменений
и t4 = packed record
Код
type
  t0=array[1..200] of word;
  t7=array[1..10] of real48;
  t8=array[1..10] of Smallint;

  t4=packed record
     name:String[5];
     smen:String[1];
     ust:Smallint;
     kanal:Smallint;
     rabo:String[2];
     zadan:t7;
     izmen:t8;
     cht:Smallint;
     xt:t0;
  end;

Попробуй так - уверен, у тебя получится (по-крайней мере, у меня совпадают)...

А packed нужен, т.к.
Цитата
The reserved word packed can prefix an array type declaration.
However, it has no effect in Turbo Pascal, since packing occurs
automatically.
Но в Delphi он не автоматический...

Автор: bagira 24.1.2004, 20:15
Благодарю всех, кто принял участие в обсуждении!

Packed Record - вот в чем была проблема. Таким образом, заработал последний предложенный вариант (включающий: SmallInt, Real48, String, Word, Packed Record).

Какие вы все молодцы!



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)