Spec-Zone.ru › Haskell 7

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.

Указатели на данные

data Ptr a Источник

Значение типа Ptr a представляет указатель на объект или массив объектов, которые могут быть переданы или получены из значений Haskell типа a.

Тип a часто будет экземпляром класса Storable, который предоставляет операции маршалинга. Однако это необязательно, и вы можете предоставить свои собственные операции для доступа к указателю. Например, вы можете написать небольшие внешние функции для получения или установки полей C struct.

Экземпляры

Eq (Ptr a)
(Data a, Typeable * a) => Data (Ptr a)
Ord (Ptr a)
Show (Ptr a)
Storable (Ptr a)

nullPtr :: Ptr a Источник

Константа 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)

Указатели на функции

data FunPtr a Источник

Значение типа 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

Экземпляры

Eq (FunPtr a)
Ord (FunPtr a)
Show (FunPtr a)
Storable (FunPtr a)

nullFunPtr :: FunPtr a Источник

Константа nullFunPtr содержит выделенное значение FunPtr, которое не связано с допустимым местом в памяти.

castFunPtr :: FunPtr a -> FunPtr b Источник

Приводит FunPtr к FunPtr другого типа.

castFunPtrToPtr :: FunPtr a -> Ptr b Источник

Приводит FunPtr к Ptr.

Примечание: это допустимо только на архитектурах, где указатели на данные и функции охватывают один и тот же набор адресов, и должно использоваться только для связывания с внешними библиотеками, интерфейс которых уже опирается на это предположение.

castPtrToFunPtr :: Ptr a -> FunPtr b Источник

Приводит Ptr к FunPtr.

Примечание: это допустимо только на архитектурах, где указатели на данные и функции охватывают один и тот же набор адресов, и должно использоваться только для связывания с внешними библиотеками, интерфейс которых уже опирается на это предположение.

freeHaskellFunPtr :: FunPtr a -> IO () Источник

Освободить память, связанную с данным FunPtr, который должен был быть получен от заглушки обертки. Это необходимо вызывать каждый раз, когда возвращаемое значение от внешней функции-обертки больше не требуется; иначе память будет утечка.

Целочисленные типы с безошибочным преобразованием в указатели и из них

data IntPtr Источник

Целочисленный тип со знаком, который можно безошибочно преобразовать в указатель и из него. Этот тип также совместим с типом C99 intptr_t, и может безопасно передаваться в него и из него.

Примеры использования

Ограниченный IntPtr
Перечисление IntPtr
Eq IntPtr
Целочисленный IntPtr
Num IntPtr
Ord IntPtr
Чтение IntPtr
Вещественный IntPtr
Показать IntPtr
Конечные биты IntPtr
Биты IntPtr
Storable IntPtr

ptrToIntPtr :: Указатель a -> IntPtr Источник

преобразует указатель Ptr в IntPtr

intPtrToPtr :: IntPtr -> Указатель a Источник

преобразует IntPtr в указатель Ptr

тип WordPtr Источник

Безопасный целочисленный тип без знака, который можно без потерь преобразовать в и из Ptr. Этот тип также совместим с типом C99 uintptr_t, и его можно безопасно использовать для обмена данными.

Примеры использования

Ограниченный WordPtr
Перечисление WordPtr
Eq WordPtr
Целочисленный WordPtr
Num WordPtr
Ord WordPtr
Чтение WordPtr
Вещественный WordPtr
Показать WordPtr
Конечные биты WordPtr
Биты WordPtr
Storable WordPtr

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API