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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Типизированные/нетипизированные указатели.

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

Absurd » 10 сен 2007, 23:38

Давай-ка озвуч в общем в чем у тебя задача. И мы прдумаем решение получше.

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

Alpha » 10 сен 2007, 22:41

Прошу прощения за перерыв. Серж прав во многом. Идея в том, чтобы определить родительский тип данных допустим Raw - неформатированные - одно из полей класса Data, нопример ElemType: Raw. За тем создавая класс DataReal я мог присвоить что-то вроде DataReal.ElemType := Real. И дальше в вычислениях сделать так: A := DataReal.ElemType(Pointer^) и наверное Inc(DataReal.ElemType(Pointer^)).

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

Serge_Bliznykov » 10 сен 2007, 20:49

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

p.s. а пообщаться с Вами было приятно...

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

BBB » 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.

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

Absurd » 10 сен 2007, 13:30

Serge_Bliznykov писал(а):2 absurd

угу... а нетипизорованного, как того хочет alpha на сколько байт?
И ещё, как вы в процедуре опеределите, указатель на какой именно тип Вам передан?...
К нетипизированным указателям и указателям на декларированные, но не имплементированные в данном контексте типы в С нельзя прибавить даже 0. Как в дельфи - не знаю.

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

Serge_Bliznykov » 09 сен 2007, 22:56

2 absurd
Инкремент типизированного указателя происходит на количество байт, которое занимет тип.
угу... а нетипизорованного, как того хочет alpha на сколько байт?
И ещё, как вы в процедуре опеределите, указатель на какой именно тип Вам передан?...

впрочем, господа, ушел учить C для расширения кругозора... ;-))

alpha
Дело в том, что Variant слишком медленно работает. Обрабатывать нужно многомерные массивы с большим количеством элементов. А в остальном он идеально подходит
ну тогда я пасс... Пробуйте изменить алгоритм обработки/либо использовать pointer - и при этом искусственно передавать информацию о том, на какой тип показывает данный pointer - трудно что то конкрентное сказать, поскольку Вы знаете, что Вам нужно, а мы нет...

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

Alpha » 09 сен 2007, 21:05

Дело в том, что Variant слишком медленно работает. Обрабатывать нужно многомерные массивы с большим количеством элементов. А в остальном он идеально подходит.

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

Absurd » 09 сен 2007, 21:03

Serge_Bliznykov писал(а):ну, сложение пройдёт, так, как Вы написали.
возможно потребуется приведение ручками типов данных. (в integer doube просто так не запишешь, хоть через указатели, хоть без них...) но это всё лёгко проверяется.

- а это ещё что за фокусы?!!! Указатель, это адрес переменной в памяти!!!! и Вы хотите его передвинуть? На байт, на слово?!
и куда он после этого будет показывать?!!!!
Инкремент типизированного указателя происходит на количество байт, которое занимет тип. Используется для эмуляции динамических массивов - получается кусок памяти нужного размера с помощью HeapAlloc к примеру, и кастуется к указателю на тип. Потом этот типизированный указатель можно применять для навигации - инкрементить и декрементить его. Поскольку инкремент и декремент изменяет значение указателя на размер типа, получается типа как динамический массив. В С можно инкрементить его на произвольное количество элементов за раз для доступа к произвольному элементу такого динамического массива за константное время. В delphi наверное тоже так то так можно сделать.
Изучите чтоли С для расширения кругозора.

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

Serge_Bliznykov » 09 сен 2007, 19:40

слушайте, а может быть Вам нужет тип данных Variant ?
в нём как раз можно получить тип данных, который в нём находится в текущий момент!

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

Alpha » 09 сен 2007, 18:34

Смысл как раз в том, что я не знаю как указать тип данных, хранящихся в памяти по указателю. Есть класс-родитель Data - у него поле DataAddress - указатель допустим Pointer, поскольку он тип данных не знает. От него наследуем DataReal - как ему изменить поле DataAdress на ^Real? Может это можно обойти как? И допустим имеем функцию Func(Data1, Data2 : Data): Data. Передаем этой функции два экземпляра: DataReal1 и DataReal2. Как в функции узнать, что нужно Real(DataAddress) а не Double(DataAddress)?

Вернуться к началу