Как получить значение указателя в 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 не может представлять указатель на всех платформах.