Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Конструкция record`а.


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо