Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2010, 16:30   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Изменить RecordSize после части считывания.

Открываю файл:
Код:
Assign(F,Path+FileName);
Reset(F,SizeOf(Membrane));
BlockRead(F,Membrane,1);
У меня еще есть остальные органоиды, которые также требуют загрузки своих параметров из файла. Но проблема в том, что они все имеют разный SizeOf. К примеру SizeOf(Nucleus) = 72, А SizeOf(Membrane) = 42. Как считать другие органоиды? Единственное решение, которое я вижу - использовать несколько файлов, но оно мне не очень нравится, поскольку гора файлов в папке с размером до 72 байт - не очень хорошая идея.

P.S. Органоиды = записи.

UPD ------------------------------------

Еще пришел в голову такой "зверский" способ:
Считали первый органоид, Потом открыли файл снова reset`ом, в котором поставили размер второго органоида, так как каретка сбита, отмотали вперед SizeOf(Membrane) байт, считали второй органоид, и т.д., пока все не будут считаны. Но способ, конечно, зверский. Есть что-нибудь менее извращенное?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 15.01.2010 в 17:09.
Alex Cones вне форума Ответить с цитированием
Старый 15.01.2010, 17:39   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

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

далее считав 1 хэдер мы имеем расположение всех органоидов и свободно получить их тело через sizeof()... пример >>> тут <<<

...единственно, тут подход лучше не через assign, а читать файл архива (набора всех ДНК) в filestream или memorystream.
Код:
4 байта на размер хэдера (размер хэдера = 4 + 4 + n*(4+4))
4 байта на кол-во органоидов
4 байта на адрес и 4 байта на размер первого органоида
4 байта на адрес и 4 байта на размер второго органоида
4 байта на адрес и 4 байта на размер n-го органоида

адрес первого органоида
тело

адрес второго органоида
тело

адрес n-го органоида
тело
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 15.01.2010 в 17:49.
raxp вне форума Ответить с цитированием
Старый 15.01.2010, 17:44   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Спасибо, буду бороться... Надеюсь не стану жертвой фагоцитоза...
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 15.01.2010, 17:48   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

тут важно изначально определиться с первым хэдером, то бишь выделением именно 4 байт на адрес и размер органоида, хотя 32 разрядов должно с головой хватить.

upd
-------

немножно переосмыслил структуру...
Код:
  // STADO STRUCT-
  NameHead = record
   name_nabor_dnk: array [0..255] of Char; // name stado
   count_ameba     : Longword;                 // count amebi
  end;

  // AMEBA STRUCT-
  NameAmeba = record
   name_ameba: array [0..255] of Char;     // name ameba
   size_ameba: longword;                        // size telo
  end;


 TListAmeba = record // динамический массив амеб
   ameba: array of NameAmeba;
   //... тут еще чего нибудь
  end;

var la: tlistameba;
вначале считываем NameHead и узнаем кол-во тел в стаде, потом считываем столько раз блоки с описанием амеб NameAmeba, сколько count_ameba из NameHead. Окончание будет означать начальную позицию первого тела, а размеры каждой нам уже известны из TListAmeba, далее просто считываем блоки информации, смещая каждый раз позицию считывания на размер каждого предыдущего тела.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 15.01.2010 в 18:10.
raxp вне форума Ответить с цитированием
Старый 15.01.2010, 18:24   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а может описать метод LoadFromStream?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с циклом считывания и записи в Memo. Nocturnal Помощь студентам 7 08.12.2009 13:50
В адо изменить путь после кампиляции DennerV БД в Delphi 8 06.06.2009 10:53
Процедура для считывания значений переменных xPAL Общие вопросы Delphi 4 07.12.2008 19:23
считывания данных с TCP/IP kyc0k Помощь студентам 1 08.04.2008 11:45
Осуществление последовательного считывания атрибутов Meskalito БД в Delphi 5 01.04.2008 17:17