![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правила записи record, ...
tymofy © (2007-09-17 22:50:00)Как надо записывать подобные записи в лпне удобства, стандартов, ...
TFileHeader = record
FileIdent: Byte;
FileSize: DWord;
FileChecksum: Word;
end;
или
TFileHeader = record
Ident: Byte;
Size: DWord;
Checksum: Word;
end;
Как стоит записывать?
evvcom (2007-09-19 12:59:00) [1]
> Anatoly Podgoretsky © (19.09.07 11:08) [19]
:) Ну да, проблема прокладки между рулем и сиденьем :)
Anatoly Podgoretsky (2007-09-19 11:08:00) [2]> evvcom (19.09.2007 08:44:18) [18]
То есть руки и чем думаем
evvcom (2007-09-19 08:44:00) [3]
> Slym © (19.09.07 04:47) [16]
> именно с записью... вот сохранит он эту запись в файл, перекомпилируется
> и считать из файла эту запись уже не сможет данные (запись)
> потеряна :)
Да, смайлик тут действительно к месту. Но описанная тобой проблема - это все же проблема с использованием и непониманием того, что пишешь, а не с самой записью.
Slym (2007-09-19 04:55:00) [4]в добавок: при задачах, в которых необходима работа с большими и "тучными" массивами записей оптимизация размера записи (путем packed или опциями {$Aх}) не на последнем месте: 8 это не 12 для наглядности: 66мб это не 100мб памяти
к массивам (стат) также приминимы правила выравнивания - массивы тоже могут быть packed, что также может отразиться на объеме занятой памяти
Slym (2007-09-19 04:47:00) [5]Виктор007 (18.09.07 12:42) [14]
TFileHeader = record
FileIdent: Byte;
FileSize: DWord;
FileChecksum: Word;
end;
теоретически размер записи = SizeOf(Byte)+SizeOf(DWord)+SizeOf(Word)=1+4+2= 7
но фактически:
- при компиляции структуры при опции {$A4} - получаем размер в 12 байт
- при компиляции структуры при опции {$A2} - получаем размер в 8 байт
- при компиляции структуры packed - получаем размер в 7 байт
- кроме того размер зависит от последовательности полей в записи (от их размера). запись эквивалентная твоей, но размером при {$A4} не 12, а 8 байт!:
TFileHeader = record
FileSize: DWord;
FileChecksum: Word;
FileIdent: Byte;
end;
evvcom © (18.09.07 10:40) [12]
Проблемы возможны не с самой записью, а с методами ее использования
именно с записью... вот сохранит он эту запись в файл, перекомпилируется и считать из файла эту запись уже не сможет данные (запись) потеряна :)
DrPass © (18.09.07 11:16) [13]
Тупо писать packed для всех записей - не решение проблемы, а извращение
Зачем для всех? только для "экспортируемых" записей: сохраняемых в файл, передаваемых между независимыми модулями...
Anatoly Podgoretsky (2007-09-18 12:48:00) [6]Проблемы при передаче в другую программу
Виктор007 (2007-09-18 12:42:00) [7]> с такой записью в дальнейшем возможны проблемы и корень
> проблемы Align fields
Опишите пожалуйста подробнее что это значит?
DrPass (2007-09-18 11:16:00) [8]
> с такой записью в дальнейшем возможны проблемы и корень
> проблемы Align fields
> При различных опциях компилятора получишь различный, несовместимый
> код
Ну наверное ж просто надо думать, когда пишешь программу. Тупо писать packed для всех записей - не решение проблемы, а извращение.
evvcom (2007-09-18 10:40:00) [9]
> с такой записью в дальнейшем возможны проблемы и корень
> проблемы Align fields
Проблемы возможны не с самой записью, а с методами ее использования. А раз так, то проблемы возможны где угодно и запись тут не при чем. А насчет Align ты все же верно подметил, я бы сделал так:
TFileHeader = record
Size: DWord;
Ident: Byte;
Checksum: Word;
end;
clickmaker (2007-09-18 09:57:00) [10]лучше второй вариант. Первый напоминает речь заики
Slym (2007-09-18 05:29:00) [11]tymofy (17.09.07 22:50)
Оба варианта не катят :) даже не морфология и синтаксис, а содержание: с такой записью в дальнейшем возможны проблемы и корень проблемы Align fields
При различных опциях компилятора получишь различный, несовместимый код.
Избежать этого можно используя TFileHeader = packedrecord
Германн (2007-09-18 01:35:00) [12]
> Правила записи record, ...
>
> tymofy (17.09.07 22:50)
>
> Как надо записывать подобные записи в планеудобства, стандартов,
> ...
Да нет таких правил. Кроме обычной разумной понятности.
P.S.
Сергей М. ©
Что-то тебя со вчерашнего вечера "понесло". Даже на простые "очепятки" вскидываешься". (Почти как ЦЧ в своих последних сообщениях на сём форуме :)
Сергей М. (2007-09-17 23:55:00) [13]
> Kostafey © (17.09.07 23:43) [7]
)
Телепатор тут не выдержит никакой нагрузки
Kostafey (2007-09-17 23:43:00) [14]> Чудесно.
> Ну а какое отношение все это имеет к "лпне удобства" ?)
Телепатор на зарядку поставили? :)
в лпне удобства -> в плане удобства
Сергей М. (2007-09-17 23:41:00) [15]
> Kostafey © (17.09.07 23:37) [5]
Чудесно.
Ну а какое отношение все это имеет к "лпне удобства" ?)
Kostafey (2007-09-17 23:37:00) [16]> Ты не торопись - в Орешнике места всем хватит
Я уже много раз пытался туда попасть.
Вот вроде уж все продумаещь, чтобы и не глупо очевидно,
что нарочно мол в орешник, и чтоб смешно.
Не получилось...
Что до > [3] Kostafey © (17.09.07 23:25)
то я слишком кратко сказал.
Смысл в том, чтобы если у нас например имеется несколько
size-оф (FileSize, RecordSize, etc), то возможно имеет смысл
выделить другой класс.
Сергей М. (2007-09-17 23:30:00) [17]
> Kostafey © (17.09.07 23:25) [3]
Ты не торопись - в Орешнике места всем хватит
Kostafey (2007-09-17 23:25:00) [18]> Как надо записывать подобные записи
так
> TFileHeader = record
> Ident: Byte;
> Size: DWord;
> Checksum: Word;
> end;
если этих size-оф несколько возможно имеет смысл делать
еще один объект, ИМХО конечно.
Сергей М. (2007-09-17 23:22:00) [19]
> Как надо записывать подобные записи в лпне удобства
Их не надо "записывать", их надо прямиком в Орешник в кач-ве рассады.
DrPass (2007-09-17 22:53:00) [20]
> Как надо записывать подобные записи в лпне удобства, стандартов
Всем бы твои проблемы...