Типизированные/нетипизированные указатели.

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

10 сен 2007, 15:24

Кстати, если все типы (IntegerType, RealType etc. ) объявить наследниками от некоего базового типа (NumbersType), то пользоваться можно указателем именно на этот базовый тип, а реальный тип во время выполнения в Delphi можно определить, используя, например оператор is.

В Паскале еще была такая функция как TypeOf, вот паскалевский Help, с примером.
Интересна фраза Can only be applied to object types that have a VMT; all other types result in an error. Т.е. у этих объектов (классов) должны иметься виртуальные методы (иначае VMT как раз и бдет отсутствовать)

Код: Выделить всё

 TypeOf (function)
 ===================
Returns a pointer to an object type's virtual method table.

 Declaration:
 procedure TypeOf (Param1: ObjectType) : Pointer

 Target:
Windows, Real, Protected

 Remarks:
Param1 is either an object type identifier or an instance of an object type

Can only be applied to object types that have a VMT; all other types result
in an error.

 See Also:
 SizeOf

 SampleCode:

  {Typeof.PAS}

 {Sample code for the TypeOf function.}

 { For Windows: }
 { uses WinCrt; }

 uses Objects;

 type
  PBaseObject = ^TBaseObject;
  TBaseObject = object(TObject)
  end;

  PChildObject = ^TChildObject;
  TChildObject = object(TBaseObject)
  end;

 var
  P,Q : PObject;   { abstract object pointer }

begin
 P := New(PBaseObject, Init);
 Q := New(PChildObject, Init);
 if TypeOf(P^) = TypeOf(TBaseObject) then
   writeln('P is a TBaseObject instance')
 else
   writeln('P is not a TBaseObject instance');

 if TypeOf(Q^) = TypeOf(TChildObject) then
   writeln('Q is a TChildObject instance')
 else
   writeln('Q is not a TChildObject instance');

 if TypeOf(Q^) <> TypeOf(P^) then
   writeln('Q is not the same kind of object instance as P');

 Dispose(P, Done);
 Dispose(Q, Done);
end.
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

10 сен 2007, 20:49

absurd в Дельфи можно это сделать... да и в С я уверен тоже можно обойти запрет языка. Вопрос то не в этом. Мы с Вами спорим и обсуждаем, но я так и не услышал от alpha как у него организованы данные и алгоритм их обработки.
То, что Вы предложили насчёт динамического размещения элементов в памяти - это абсолютно логично, но я боюсь, что вся эта затея с указателями затеяна по одной простой причине - в процедуру обработки передаются тип Data - а процедура по переданному типу должна сама определить, что ей передали - указатель на Double или на Integer или byte... Эта задача в лоб решается через тип Variant - но накладные расходы, связанные с этим типом, действительно приводят к резкому замедлению обработки данных(вычислений). Возможно, задачу можно решить, используя перегрузку методов обработки для разных классов -
но уже совсем другая песня... А может, можно передавать вместе с указателем и тип данных, на который он показывает. Но не видя, что именно нужно alpha - я лично больше, чем я сказал, предложить не могу. sic.

p.s. а пообщаться с Вами было приятно...
Alpha
Сообщения: 5
Зарегистрирован: 09 сен 2007, 17:35

10 сен 2007, 22:41

Прошу прощения за перерыв. Серж прав во многом. Идея в том, чтобы определить родительский тип данных допустим Raw - неформатированные - одно из полей класса Data, нопример ElemType: Raw. За тем создавая класс DataReal я мог присвоить что-то вроде DataReal.ElemType := Real. И дальше в вычислениях сделать так: A := DataReal.ElemType(Pointer^) и наверное Inc(DataReal.ElemType(Pointer^)).
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

10 сен 2007, 23:38

Давай-ка озвуч в общем в чем у тебя задача. И мы прдумаем решение получше.
2B OR NOT(2B) = FF
Ответить