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

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

Alpha
Сообщения: 5
Зарегистрирован: 09 сен 2007, 17:35

09 сен 2007, 17:41

Необходимо во время выполнения приложения изменять тип указателя: например с ^Integer на ^Real или ^Double.
Все это нужно для математических операций с данными, представленными различными классами. Класс однозначно определяет тип данных.
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

09 сен 2007, 17:47

используйте тип 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.
Alpha
Сообщения: 5
Зарегистрирован: 09 сен 2007, 17:35

09 сен 2007, 17:56

Это да. Но как сделать SomeType1(Pointer1) := SomeType2(Pointer2) + SomeType3(Pointer3). И далее Inc(PointerN). Где SomeType1 - тип данных первого экземпляра данных, SomeType2 - соответственно второго и SomeType3 - третьего?
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

09 сен 2007, 18:14

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

09 сен 2007, 18:34

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

09 сен 2007, 19:40

слушайте, а может быть Вам нужет тип данных Variant ?
в нём как раз можно получить тип данных, который в нём находится в текущий момент!
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

09 сен 2007, 21:03

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

- а это ещё что за фокусы?!!! Указатель, это адрес переменной в памяти!!!! и Вы хотите его передвинуть? На байт, на слово?!
и куда он после этого будет показывать?!!!!
Инкремент типизированного указателя происходит на количество байт, которое занимет тип. Используется для эмуляции динамических массивов - получается кусок памяти нужного размера с помощью HeapAlloc к примеру, и кастуется к указателю на тип. Потом этот типизированный указатель можно применять для навигации - инкрементить и декрементить его. Поскольку инкремент и декремент изменяет значение указателя на размер типа, получается типа как динамический массив. В С можно инкрементить его на произвольное количество элементов за раз для доступа к произвольному элементу такого динамического массива за константное время. В delphi наверное тоже так то так можно сделать.
Изучите чтоли С для расширения кругозора.
2B OR NOT(2B) = FF
Alpha
Сообщения: 5
Зарегистрирован: 09 сен 2007, 17:35

09 сен 2007, 21:05

Дело в том, что Variant слишком медленно работает. Обрабатывать нужно многомерные массивы с большим количеством элементов. А в остальном он идеально подходит.
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

09 сен 2007, 22:56

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

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

alpha
Дело в том, что Variant слишком медленно работает. Обрабатывать нужно многомерные массивы с большим количеством элементов. А в остальном он идеально подходит
ну тогда я пасс... Пробуйте изменить алгоритм обработки/либо использовать pointer - и при этом искусственно передавать информацию о том, на какой тип показывает данный pointer - трудно что то конкрентное сказать, поскольку Вы знаете, что Вам нужно, а мы нет...
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

10 сен 2007, 13:30

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

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