Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция, возвращающая смещение 
:(
    Опции темы
ozzii
Дата 1.7.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет



Всем привет!
Есть программа читающая/пишущая типизированный файл. Структурно файл состоит из N страниц (100 в данном случае). Смещение 1-й страницы всегда постоянно, это 8, смещение других может изменятся. Существует формула по которой можно начиная от 1-й стр. рассчитать каждое последующее смещение по принципу:
// установить смещение на начало первой страницы
setfilepointer(f, 8, nil, 0);
// прочесть размер первой страницы
ReadFile(f, c, 4, br, nil);
// рассчитать смещение следующей страницы
// установить смещение на начало следующей страницы 
и т.д.
смещение второй страницы = смещение первой страницы + 4 + размер первой страницы

Требуется функция, которая будет рассчитывать смещение и возвращать его, для каждой из 100 страниц.

код чтения первой страницы (для ясности) smile
Код

//описание типа
type
  TList1 = record
    id:integer;
    name: array [0..63] of byte;
    int1:integer;
    int2:integer;
    int3:integer;
    int4:integer;
 end;

var
  Form1: TForm1;
  List1: array of TList1;
...

procedure TForm1.Open1Click(Sender: TObject);
var f, br, sz, c1: cardinal;
ws: widestring;
begin
if opendialog1.Execute then begin
f:= CreateFile(PChar(opendialog1.FileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING, 0,0);
try
SetFilePointer(f, 8, nil, 0);
ReadFile(f, c1, 4, br, nil);
sz:= c1*SizeOf(TList1);
SetLength(List1, c1);
ReadFile(f, List1[0], sz, br, nil);
SetLength(ws, 32);
for i  := 0 to c1 - 1  do begin
 Move(List1[i].name[0], ws[1], 64);
listbox1.Items.Add(inttostr(List1[i].id) + ' - '+ ws);
end;
finally
CloseHandle(f);
end;
 end;
end;

PM MAIL   Вверх
CodeMonkey
Дата 1.7.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



А проблема-то в чём?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
ozzii
Дата 1.7.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет



проблема в жаре, не дает думать зараза   smile 

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

Это сообщение отредактировал(а) ozzii - 1.7.2009, 12:33
PM MAIL   Вверх
Frees
Дата 1.7.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



ozzii, а зачем вообще такие сложности?

и что ты понимаеш под словом страница, чет не пойму

и почему нельзя юзать типизированный файл

Код

var f: file of TList1;


Это сообщение отредактировал(а) Frees - 1.7.2009, 12:50


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ozzii
Дата 1.7.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет



ozzii, а зачем вообще такие сложности?
и что ты понимаеш под словом страница, чет не пойму
и почему нельзя юзать типизированный файл

Код

var f: file of TList1;


какие сложности?
ну под словом страница я понимаю следующее: в файле записаны данные, эти данные находятся на условных страницах (так они в проге представлены, в виде страниц).
так я и так типизированный файл использую
PM MAIL   Вверх
Frees
Дата 1.7.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(ozzii @  1.7.2009,  16:03 Найти цитируемый пост)
ну под словом страница я понимаю следующее: в файле записаны данные, эти данные находятся на условных страницах (так они в проге представлены, в виде страниц).

тогда размеры "Страниц" должны быть одинаковые


Цитата(ozzii @  1.7.2009,  16:03 Найти цитируемый пост)
так я и так типизированный файл использую

сам файл может типизирован, хотя не понятно почему тогда размер записей разный(поправте если не прав)

но работаеш ты с ним как с набором байт...

пример что я понимаю под работать с типизированными файла
Код

type
  TMyRec = record
    s1: string[10];
    s2: string[11];
  end;

procedure TForm21.Button1Click(Sender: TObject);
var MyVar: TMyRec;
  f: file of TMyRec;
begin
  //Пишем
  AssignFile(f, 'b');
  Rewrite(f);
  MyVar.s1 := '123';
  MyVar.s2 := '456';
  write(f, MyVar);
  MyVar.s1 := '666';
  MyVar.s2 := '7777';
  write(f, MyVar);
  Closefile(f);
end;

procedure TForm21.Button2Click(Sender: TObject);
var MyVar: TMyRec;
  f: file of TMyRec;
begin
//читаем
  AssignFile(f, 'b');
  Reset(f);
  Read(f, MyVar);
  Memo1.Lines.Add(MyVar.s1);
  Memo1.Lines.Add(MyVar.s2);
  Read(f, MyVar);
  Memo1.Lines.Add(MyVar.s1);
  Memo1.Lines.Add(MyVar.s2);
  Closefile(f);
end;



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ozzii
Дата 1.7.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет



Цитата

сам файл может типизирован, хотя не понятно почему тогда размер записей разный(поправте если не прав)

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

Цитата

но работаеш ты с ним как с набором байт...


да, все верно, как с набором байт. дело в том, что по другому выводимые данные становятся нечитаемыми

Это сообщение отредактировал(а) ozzii - 1.7.2009, 13:22
PM MAIL   Вверх
Frees
Дата 1.7.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



в типизированных файлах "страницы" одного размера!!!

помоему ты где то в корне не прав работая по байтно с файлом...смотри пример выше!



ты файл сам создаеш?




--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ozzii
Дата 1.7.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет



нет, файл не мой, он уже был создан как набор таких страниц, менять его структуру я не могу.

данный файл имеет след. строение: у каждой страницы своя структура, потому и приходится изощрятся
скажем так, этот файл типизированный, но немного иначе smile

Это сообщение отредактировал(а) ozzii - 1.7.2009, 14:19
PM MAIL   Вверх
Frees
Дата 1.7.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(ozzii @  1.7.2009,  17:14 Найти цитируемый пост)
у каждой страницы своя структура

описана то у тебя только одна - TList1

Добавлено через 1 минуту и 3 секунды
может выложиш такой файл?


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ozzii
Дата 2.7.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет



получил?
PM MAIL   Вверх
Frees
Дата 3.7.2009, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



так для каждой записи своя структура? или есть переодичность?


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ozzii
Дата 3.7.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет



Цитата

так для каждой записи своя структура? 

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

Это сообщение отредактировал(а) ozzii - 3.7.2009, 10:42
PM MAIL   Вверх
Frees
Дата 3.7.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



дак завиди массив с размерами записи 

и считай сумму размеров страниц до нужной, можно даже файл не трогать

Код

var 
  RecSizes: array [0..100] of integer = (120,102,20,54....)//размеры страниц


поиск смещения страницы n это сума размеров предыдущих страниц
Код

var displace : Integer;
displace := 8;
for i := 0 to n - 1 do
 displace := displace + RecSizes[i]


Это сообщение отредактировал(а) Frees - 3.7.2009, 12:35


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ozzii
Дата 3.7.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.7.2009

Репутация: нет
Всего: нет




такой еще вопрос, а как записать изменения?
например данные прочитаны и помещены в 10 едитов, а если вот изменил содержимое одного или неск. едитов, как их назад в файл впихнуть? надо в одну строку собрать или как правильно?
в смысле набор байт
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.