Страница 1 из 2

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

Добавлено: 09 сен 2007, 17:41
Alpha
Необходимо во время выполнения приложения изменять тип указателя: например с ^Integer на ^Real или ^Double.
Все это нужно для математических операций с данными, представленными различными классами. Класс однозначно определяет тип данных.

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

Добавлено: 09 сен 2007, 17:47
Serge_Bliznykov
используйте тип Pointer
он как раз для этого и создан.

из хелпа Дельфи:
The most versatile is Pointer, which can point to data of any kind. But a Pointer variable cannot be dereferenced; placing the ^ symbol after a Pointer variable causes a compilation error. To access the data referenced by a Pointer variable, first cast it to another pointer type and then dereference it.

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

Добавлено: 09 сен 2007, 17:56
Alpha
Это да. Но как сделать SomeType1(Pointer1) := SomeType2(Pointer2) + SomeType3(Pointer3). И далее Inc(PointerN). Где SomeType1 - тип данных первого экземпляра данных, SomeType2 - соответственно второго и SomeType3 - третьего?

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

Добавлено: 09 сен 2007, 18:14
Serge_Bliznykov
ну, сложение пройдёт, так, как Вы написали.
возможно потребуется приведение ручками типов данных. (в integer doube просто так не запишешь, хоть через указатели, хоть без них...) но это всё лёгко проверяется.
И далее Inc(PointerN)
- а это ещё что за фокусы?!!! Указатель, это адрес переменной в памяти!!!! и Вы хотите его передвинуть? На байт, на слово?!
и куда он после этого будет показывать?!!!!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 10 сен 2007, 13:30
Absurd
Serge_Bliznykov писал(а):2 absurd

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