Foreign.Ptr
| Copyright | (c) The FFI task force 2001 |
|---|---|
| License | BSD-style (see the file libraries/base/LICENSE) |
| Maintainer | ffi@haskell.org |
| Stability | provisional |
| Portability | portable |
| Safe Haskell | Trustworthy |
| Language | Haskell2010 |
Содержание
Описание
Этот модуль предоставляет типизированные указатели на внешние данные. Он является частью интерфейса внешних функций (FFI) и обычно импортируется через модуль Foreign.
Указатели на данные
Значение типа Ptr a представляет указатель на объект или массив объектов, которые могут быть переданы или получены из значений Haskell типа a.
Тип a часто будет экземпляром класса Storable, который предоставляет операции маршалинга. Однако это необязательно, и вы можете предоставить свои собственные операции для доступа к указателю. Например, вы можете написать небольшие внешние функции для получения или установки полей C struct.
Экземпляры
Константа nullPtr содержит выделенное значение Ptr, которое не связано с допустимым местом в памяти.
castPtr :: Ptr a -> Ptr b Источник
Функция castPtr выполняет приведение типа указателя из одного типа в другой.
plusPtr :: Ptr a -> Int -> Ptr b Источник
Смещает указанный адрес на заданное смещение в байтах.
alignPtr :: Ptr a -> Int -> Ptr a Источник
При заданном произвольном адресе и условии выравнивания alignPtr возвращает следующий более высокий адрес, удовлетворяющий условию выравнивания. Условие выравнивания x выполняется для любого адреса, кратного x. Эта операция идемпотентна.
minusPtr :: Ptr a -> Ptr b -> Int Источник
Вычисляет смещение, необходимое для получения от второго аргумента к первому. У нас есть
p2 == p1 `plusPtr` (p2 `minusPtr` p1)
Указатели на функции
Значение типа FunPtr a является указателем на функцию, вызываемую из внешнего кода. Тип a обычно является внешним типом, типом функции с нулем или более аргументами, где
- типы аргументов являются передаваемыми внешними типами, т.е.
Char,Int,Double,Float,Bool,Int8,Int16,Int32,Int64,Word8,Word16,Word32,Word64,Ptr a,FunPtr a,StablePtr aили переименованием любого из них с помощьюnewtype. - тип возвращаемого значения является либо передаваемым внешним типом, либо имеет вид
IO t, гдеtявляется передаваемым внешним типом или().
Значение типа FunPtr a может быть указателем на внешнюю функцию, возвращенной другой внешней функцией или импортированной со статическим адресом, как
foreign import ccall "stdlib.h &free" p_free :: FunPtr (Ptr a -> IO ())
или указателем на функцию Haskell, созданной с использованием обертки-заглушки, объявленной для создания FunPtr нужного типа. Например:
type Compare = Int -> Int -> Bool foreign import ccall "wrapper" mkCompare :: Compare -> IO (FunPtr Compare)
Вызовы заглушек оберток, таких как mkCompare, выделяют память, которую необходимо освободить с помощью freeHaskellFunPtr, когда она больше не требуется.
Для преобразования значений FunPtr в соответствующие функции Haskell можно определить динамическую заглушку для конкретного внешнего типа, например
type IntFunction = CInt -> IO () foreign import ccall "dynamic" mkFun :: FunPtr IntFunction -> IntFunction
nullFunPtr :: FunPtr a Источник
Константа nullFunPtr содержит выделенное значение FunPtr, которое не связано с допустимым местом в памяти.
castFunPtr :: FunPtr a -> FunPtr b Источник
Приводит FunPtr к FunPtr другого типа.
castFunPtrToPtr :: FunPtr a -> Ptr b Источник
Примечание: это допустимо только на архитектурах, где указатели на данные и функции охватывают один и тот же набор адресов, и должно использоваться только для связывания с внешними библиотеками, интерфейс которых уже опирается на это предположение.
castPtrToFunPtr :: Ptr a -> FunPtr b Источник
Примечание: это допустимо только на архитектурах, где указатели на данные и функции охватывают один и тот же набор адресов, и должно использоваться только для связывания с внешними библиотеками, интерфейс которых уже опирается на это предположение.
freeHaskellFunPtr :: FunPtr a -> IO () Источник
Освободить память, связанную с данным FunPtr, который должен был быть получен от заглушки обертки. Это необходимо вызывать каждый раз, когда возвращаемое значение от внешней функции-обертки больше не требуется; иначе память будет утечка.
Целочисленные типы с безошибочным преобразованием в указатели и из них
Целочисленный тип со знаком, который можно безошибочно преобразовать в указатель и из него. Этот тип также совместим с типом C99 intptr_t, и может безопасно передаваться в него и из него.
Примеры использования
ptrToIntPtr :: Указатель a -> IntPtr Источник
преобразует указатель Ptr в IntPtr
intPtrToPtr :: IntPtr -> Указатель a Источник
преобразует IntPtr в указатель Ptr
Безопасный целочисленный тип без знака, который можно без потерь преобразовать в и из Ptr. Этот тип также совместим с типом C99 uintptr_t, и его можно безопасно использовать для обмена данными.
Примеры использования
ptrToWordPtr :: Указатель a -> WordPtr Источник
преобразование указателя Ptr в WordPtr
wordPtrToPtr :: WordPtr -> Указатель a Источник
преобразование WordPtr в Ptr
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Foreign-Ptr.html