![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конструкция record`а.
Riply © (2007-11-03 13:49:00)Здравствуйте !
Чем при создании (использовании) отличаются следующие два рекорда:
type
TSysRec = packed record
NextOffset: ULONG;
function MyFunct: NTSTATUS;
end;
type
TSysRec = packed record
NextOffset: ULONG;
end;
?.
Некузяво вышло.
Попробую сформулировать вопрос по-другому:
Допустим есть некий рекорд (TSysRec), с которым
работают(создают, записывают, считывают и т.п.) некие Nt-функции
и менять его размер, "структуру" нельзя ну ни на йоту.
А мне вот приспичило добавить в него свою функцию и все тут :)
Какие изменения в его внутренности внесу и чем это может быть черевато ?
guav (2007-11-03 16:44:00) [21]PS: Я вообще не вижу существенных преимуществ методов рекордов перед свободными функциями принимающими те же рекорды, а вот недостатки вижу.
guav (2007-11-03 16:28:00) [22]> > Если на С++ устроит, то atltypes.h .
> У меня нет такого файла.
Ну по мсдн можно глянуть что это
http://msdn2.microsoft.com/en-us/library/t792xy69(VS.80).aspx
Смысл в том что наследник tagPOINT полностью совместим с tagPOINT из Windows.pas, но имеет методы.
> но не стоит, ибо это "порочная практика". ?
Ну это только моё имхо :)
Я бы не стал так делать т.к. имхо расклад полей твоей структуры относится к интерфейсу (тебе нужен конкреный расклад для чтения структуры откуда-либо и/или передачи куда либо, не так ли ?), а методы - к реализации. Полезно разделять интерфейс и реализацию.
Riply (2007-11-03 16:06:00) [23]Т.е. резюме такое:
В "неприкасаемую" структуру можно добавить свои ф-ии,
но не стоит, ибо это "порочная практика". ?
Riply (2007-11-03 15:52:00) [24]> [14] Джо © (03.11.07 15:40)
> Это самое...
Ну, это совсем другое дело ! :)
> [15] guav © (03.11.07 15:42)
> Если на С++ устроит, то atltypes.h .
У меня нет такого файла.
> Могу написать пример на Delphi, но он скорее всего не скомпилится :)
Спасибо не стоит. Лучше тратить время на компилируемые примеры :)
guav (2007-11-03 15:43:00) [25]> > [12] guav © (03.11.07 15:35)
> > Что именно должно хранится в _экземпляре_ структуры, специфичное
> для конкретного экзепляра,
> > если методы статические, и потому должны реализованы одинаково
> для всех структур данного типа ?
>
> Второе
Ээ не понял что второе ?
guav (2007-11-03 15:42:00) [26]> (наследники винапишных структур...поэтому бинарно совместимы)
> ?
Если на С++ устроит, то atltypes.h . Могу написать пример на Delphi, но он скорее всего не скомпилится :)
Джо (2007-11-03 15:40:00) [27]> [10] Riply © (03.11.07 15:30)
> > [7] Джо © (03.11.07 15:15)
> > Ну, в экз. класса тоже адреса его методов не хранятся,
> они хранятся в классе. Гм, загнул :)
>
> Эта... А можно еще раз и по-медленнее ? :)
Это самое...
TClass1 = class
procedure A;
end;
TClass2 = class
procedure A;
procedure B;
end;
var
C1: TClass1;
C2: TClass2;
begin
C1 := TClass1.Create;
C2 := TClass2.Create;
ShowMessage(IntToStr(C1.InstanceSize));
ShowMessage(IntToStr(C2.InstanceSize));
end;
Riply (2007-11-03 15:40:00) [28]> [12] guav © (03.11.07 15:35)
> Что именно должно хранится в _экземпляре_ структуры, специфичное для конкретного экзепляра,
> если методы статические, и потому должны реализованы одинаково для всех структур данного типа ?
Второе
guav (2007-11-03 15:35:00) [29]Подозреваю что в Delphi вообще не добавили и не добавят наследование recordов, поэтому виртуальные методы там тоже не должны поддерживатся, и структуры при добавлении методов всегда будут бинарно такими же.
Всё же я бы не смешивал структуру и методы. Если тебе нужно конкретное расположение полей структуры, значит структура не твоя, и не стоит чужую структуру смешивать со своими методами.
> Но ведь должно же где-то хранится...
Что именно должно хранится в _экземпляре_ структуры, специфичное для конкретного экзепляра, если методы статические, и потому должны реализованы одинаково для всех структур данного типа ?
Riply (2007-11-03 15:33:00) [30]> [9] guav © (03.11.07 15:27)
> В Майкрософтовских библитотеках для С++ есть наследники винапишных структур
> которые не содержат собственных полей и виртуальных методов,
> поэтому бинарно совместимы с соответсвующими базовыми структурами.
А где-бы посмотреть примеры реализации этого
(наследники винапишных структур...поэтому бинарно совместимы) ?
Riply (2007-11-03 15:30:00) [31]> [7] Джо © (03.11.07 15:15)
> Ну, в экз. класса тоже адреса его методов не хранятся, они хранятся в классе. Гм, загнул :)
Эта... А можно еще раз и по-медленнее ? :)
> [8] Leonid Troyanovsky © (03.11.07 15:23)
Но ведь должно же где-то хранится... Что-то, где-то меняется...
Именно поэтому у меня и появился вопрос о
добавлении ф-ии в "неприкасаемую структуру" :)
guav (2007-11-03 15:27:00) [32]Методам незачем добавлять что-либо к структуре, пока среди них нет виртуальных методов.
В Майкрософтовских библитотеках для С++ есть наследники винапишных структур которые не содержат собственных полей и виртуальных методов, поэтому бинарно совместимы с соответсвующими базовыми структурами.
Leonid Troyanovsky (2007-11-03 15:23:00) [33]
> Riply © (03.11.07 14:31) [6]
> А почему не показывает изменение размера:
Сдаюсь, не знаю :)
--
Regards, LVT.
Джо (2007-11-03 15:15:00) [34]Ну, в экз. класса тоже адреса его методов не хранятся, они хранятся в классе. Гм, загнул :)
Riply (2007-11-03 14:31:00) [35]> [5] Leonid Troyanovsky © (03.11.07 14:07)
> Добавив поле - меняем размер.
> Нельзя менять размер - нельзя добавить поле.
А почему не показывает изменение размера:
type
TSysRec = packed record
NextOffset: ULONG;
end;
TSysRecEx = packed record
NextOffset: ULONG;
function SizeOfMe: ULONG;
end;
function TSysRecEx.SizeOfMe:ULONG;
begin
Result := SizeOf(TSysRecEx);
end;
ShowMessage(IntToStr(SizeOf(TSysRec)) + sLineBreak + IntToStr(SizeOf(TSysRecEx))) ?
В обоих случаях - четыре байта.
Leonid Troyanovsky (2007-11-03 14:07:00) [36]
> Riply © (03.11.07 13:49)
> и менять его размер, "структуру" нельзя ну ни на йоту.
> А мне вот приспичило добавить в него свою функцию и все
Добавив поле - меняем размер.
Нельзя менять размер - нельзя добавить поле.
"Привязывай" свою функцию другим образом,
например через список: адрес структуры - функция.
--
Regards, LVT.
Riply (2007-11-03 14:06:00) [37]> [3] palva © (03.11.07 14:02)
> На пенсию пора...
Не знание новых "примочек" в последних версиях продукта - отнюдь
не повод для удирания на пенсию. (Без смайлика)
Так что и не мечтай :)
palva (2007-11-03 14:02:00) [38]На пенсию пора...
Riply (2007-11-03 14:01:00) [39]> [1] palva © (03.11.07 13:55)
> А разве record может содержать функцию? Это ведь не struct
У меня BDS 2006 кушает и, даже, причмокивает :)
palva (2007-11-03 13:55:00) [40]А разве record может содержать функцию? Это ведь не struct