Как получить значение указателя в Haskell?

Я хочу, чтобы манипулировать данными на очень низком уровне.

поэтому у меня есть функция, которая получает адрес виртуальной памяти как целое число и "делает вещи" с этим адресом памяти. Я связал эту функцию с C, поэтому она имеет тип (CUInt -> a). Память, которую я хочу связать, - это Word8 в файле. К сожалению, я понятия не имею, как получить доступ к значению указателя на этот Word8.

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

2 ответов


для простого примера предположим, что вы хотите добавить смещение к указателю.

перед вопросом:

module Main where
import Control.Monad (forM_)
import Data.Char (chr)
import Data.Word (Word8)
import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
import Foreign.Ptr (Ptr, plusPtr)
import Foreign.Storable (peek)
import System.IO.MMap (Mode(ReadOnly), mmapFileForeignPtr)

Да, вы написали, что вам не нужно значение Word8, но я восстановил его с peek чтобы продемонстрировать, что указатель действителен. У вас может возникнуть искушение return на Ptr внутри withForeignPtr, но документация предупреждает, что:

обратите внимание, что небезопасно возвращать указатель из действия и использовать его после завершения действия. Все использование указателя должно быть внутри withForeignPtr кронштейн. Причина этого unsafeness такой же, как и для unsafeForeignPtrToPtr ниже: финализатор может работать раньше, чем ожидалось, потому что компилятор может отслеживать только использование


вы, вероятно, ищете ptrToIntPtr и возможно fromIntegral чтобы сделать его CUInt.

обратите внимание, что CUInt не может представлять указатель на всех платформах.