| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Типы файлов - переход от Паскаля к Дельфи |
| Автор: bagira 24.1.2004, 01:41 | ||
| Ситуация такая: в течение нескольких лет происходит сбор данных некоторых технологических процессов с большого количества установок. Программы, разработанные мной в DOS Turbo Pascal 7, условно делятся на две группы: 1-сбор данных, 2 - обработка данных. После программы сбора данных происходит добавление записей в файлы (тип файла и структура записи - см. ниже). Программа математической обработки запускается пользователем позднее, выборочно, и, может быть, касается не всех созданных файлов. Вот так описывается структура записи в Паскале (в старой программе): ---------
Осуществляется переход к программам для 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 | ||
|
| Автор: 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-и как были. В общем, я бы написал так:
|
| Автор: 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 | ||
К тому же по-моему переменная типа стринг занимает минимум два байта, может в этом проблема А может я и не прав |
| Автор: <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
Попробуй так - уверен, у тебя получится (по-крайней мере, у меня совпадают)... А packed нужен, т.к.
|
| Автор: bagira 24.1.2004, 20:15 |
| Благодарю всех, кто принял участие в обсуждении! Packed Record - вот в чем была проблема. Таким образом, заработал последний предложенный вариант (включающий: SmallInt, Real48, String, Word, Packed Record). Какие вы все молодцы! |