Типизированные/нетипизированные указатели.
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Необходимо во время выполнения приложения изменять тип указателя: например с ^Integer на ^Real или ^Double.
Все это нужно для математических операций с данными, представленными различными классами. Класс однозначно определяет тип данных.
Все это нужно для математических операций с данными, представленными различными классами. Класс однозначно определяет тип данных.
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
используйте тип 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.
он как раз для этого и создан.
из хелпа Дельфи:
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.
Это да. Но как сделать SomeType1(Pointer1) := SomeType2(Pointer2) + SomeType3(Pointer3). И далее Inc(PointerN). Где SomeType1 - тип данных первого экземпляра данных, SomeType2 - соответственно второго и SomeType3 - третьего?
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
ну, сложение пройдёт, так, как Вы написали.
возможно потребуется приведение ручками типов данных. (в integer doube просто так не запишешь, хоть через указатели, хоть без них...) но это всё лёгко проверяется.
и куда он после этого будет показывать?!!!!
возможно потребуется приведение ручками типов данных. (в integer doube просто так не запишешь, хоть через указатели, хоть без них...) но это всё лёгко проверяется.
- а это ещё что за фокусы?!!! Указатель, это адрес переменной в памяти!!!! и Вы хотите его передвинуть? На байт, на слово?!И далее Inc(PointerN)
и куда он после этого будет показывать?!!!!
Смысл как раз в том, что я не знаю как указать тип данных, хранящихся в памяти по указателю. Есть класс-родитель Data - у него поле DataAddress - указатель допустим Pointer, поскольку он тип данных не знает. От него наследуем DataReal - как ему изменить поле DataAdress на ^Real? Может это можно обойти как? И допустим имеем функцию Func(Data1, Data2 : Data): Data. Передаем этой функции два экземпляра: DataReal1 и DataReal2. Как в функции узнать, что нужно Real(DataAddress) а не Double(DataAddress)?
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
слушайте, а может быть Вам нужет тип данных Variant ?
в нём как раз можно получить тип данных, который в нём находится в текущий момент!
в нём как раз можно получить тип данных, который в нём находится в текущий момент!
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Инкремент типизированного указателя происходит на количество байт, которое занимет тип. Используется для эмуляции динамических массивов - получается кусок памяти нужного размера с помощью HeapAlloc к примеру, и кастуется к указателю на тип. Потом этот типизированный указатель можно применять для навигации - инкрементить и декрементить его. Поскольку инкремент и декремент изменяет значение указателя на размер типа, получается типа как динамический массив. В С можно инкрементить его на произвольное количество элементов за раз для доступа к произвольному элементу такого динамического массива за константное время. В delphi наверное тоже так то так можно сделать.Serge_Bliznykov писал(а):ну, сложение пройдёт, так, как Вы написали.
возможно потребуется приведение ручками типов данных. (в integer doube просто так не запишешь, хоть через указатели, хоть без них...) но это всё лёгко проверяется.
- а это ещё что за фокусы?!!! Указатель, это адрес переменной в памяти!!!! и Вы хотите его передвинуть? На байт, на слово?!
и куда он после этого будет показывать?!!!!
Изучите чтоли С для расширения кругозора.
2B OR NOT(2B) = FF
Дело в том, что Variant слишком медленно работает. Обрабатывать нужно многомерные массивы с большим количеством элементов. А в остальном он идеально подходит.
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
2 absurd
И ещё, как вы в процедуре опеределите, указатель на какой именно тип Вам передан?...
впрочем, господа, ушел учить C для расширения кругозора... ;-))
alpha
угу... а нетипизорованного, как того хочет alpha на сколько байт?Инкремент типизированного указателя происходит на количество байт, которое занимет тип.
И ещё, как вы в процедуре опеределите, указатель на какой именно тип Вам передан?...
впрочем, господа, ушел учить C для расширения кругозора... ;-))
alpha
ну тогда я пасс... Пробуйте изменить алгоритм обработки/либо использовать pointer - и при этом искусственно передавать информацию о том, на какой тип показывает данный pointer - трудно что то конкрентное сказать, поскольку Вы знаете, что Вам нужно, а мы нет...Дело в том, что Variant слишком медленно работает. Обрабатывать нужно многомерные массивы с большим количеством элементов. А в остальном он идеально подходит
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
К нетипизированным указателям и указателям на декларированные, но не имплементированные в данном контексте типы в С нельзя прибавить даже 0. Как в дельфи - не знаю.Serge_Bliznykov писал(а):2 absurd
угу... а нетипизорованного, как того хочет alpha на сколько байт?
И ещё, как вы в процедуре опеределите, указатель на какой именно тип Вам передан?...
2B OR NOT(2B) = FF