Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何通过getElementPtr获取指向结构中数据的指针?(在llvm包中)_Haskell_Llvm - Fatal编程技术网

Haskell 如何通过getElementPtr获取指向结构中数据的指针?(在llvm包中)

Haskell 如何通过getElementPtr获取指向结构中数据的指针?(在llvm包中),haskell,llvm,Haskell,Llvm,我试图通过ghc 7.4.1上的包在llvm中创建一个结构并访问其中的元素,我遇到了一些棘手的类型。下面是一个示例代码,我试图获取结构的第二个元素(即TestStruct中的Word32) {-# LANGUAGE TypeOperators #-} import LLVM.Core import Data.Word type TestStruct = Struct (Word16 :& Word32 :& Word64) getTestPtr :: Value (Ptr Te

我试图通过ghc 7.4.1上的包在llvm中创建一个结构并访问其中的元素,我遇到了一些棘手的类型。下面是一个示例代码,我试图获取结构的第二个元素(即TestStruct中的
Word32

{-# LANGUAGE TypeOperators #-}
import LLVM.Core
import Data.Word

type TestStruct = Struct (Word16 :& Word32 :& Word64)
getTestPtr :: Value (Ptr TestStruct) -> CodeGenFunction r (Value (Ptr Word32))
getTestPtr u = getElementPtr u (0 :: Word32, (1  :: Word32, ()))
但我在ghc 7.4.1中得到以下错误:

Test.hs:8:16:
    Overlapping instances for llvm-3.0.0.0:LLVM.Core.Instructions.GetField
                                (Word32, Word64) i Word32
      arising from a use of `getElementPtr'
    Matching instances:
      instance [overlap ok] (llvm-3.0.0.0:LLVM.Core.Instructions.GetField
                               as i b,
                             Succ i i') =>
                            llvm-3.0.0.0:LLVM.Core.Instructions.GetField (a, as) i' b
        -- Defined in `llvm-3.0.0.0:LLVM.Core.Instructions'
      instance [overlap ok] llvm-3.0.0.0:LLVM.Core.Instructions.GetField
                              (a, as) D0 a
        -- Defined in `llvm-3.0.0.0:LLVM.Core.Instructions'
    (The choice depends on the instantiation of `i'
     To pick the first instance above, use -XIncoherentInstances
     when compiling the other instance declarations)
    In the expression: getElementPtr u (0 :: Word32, (0 :: Word32, ()))
    In an equation for `getTestPtr':
        getTestPtr u = getElementPtr u (0 :: Word32, (0 :: Word32, ()))

Test.hs:8:16:
    No instances for (Data.TypeLevel.Num.Sets.PosI Word32,
                      Data.TypeLevel.Num.Ops.IsZero Word32 yz,
                      DivMod10 Word32 yi yl)
      arising from a use of `getElementPtr'
    Possible fix:
      add instance declarations for
      (Data.TypeLevel.Num.Sets.PosI Word32,
       Data.TypeLevel.Num.Ops.IsZero Word32 yz,
       DivMod10 Word32 yi yl)
    In the expression: getElementPtr u (0 :: Word32, (0 :: Word32, ()))
    In an equation for `getTestPtr':
        getTestPtr u = getElementPtr u (0 :: Word32, (0 :: Word32, ()))

llvm
包中索引到
Struct
需要类型级别的数字,以便可以静态计算字段类型。这就是为什么要使用描述记录字段的嵌套元组的原因。如果使用
getElementPtr
第一个索引值需要是一个正则整数(
Word32
或其他),或者只需使用
getElementPtr0

{-# LANGUAGE TypeOperators #-}
import LLVM.Core
import Data.TypeLevel
import Data.Word

type TestStruct = Struct (Word16 :& Word32 :& Word64)
getTestPtr :: Value (Ptr TestStruct) -> CodeGenFunction r (Value (Ptr Word32))
-- getTestPtr u = getElementPtr u ((0 :: Word32) & d1 & ())
getTestPtr u = getElementPtr0 u (d1 & ())

llvm
包中索引到
Struct
需要类型级别的数字,以便可以静态计算字段类型。这就是为什么要使用描述记录字段的嵌套元组的原因。如果使用
getElementPtr
第一个索引值需要是一个正则整数(
Word32
或其他),或者只需使用
getElementPtr0

{-# LANGUAGE TypeOperators #-}
import LLVM.Core
import Data.TypeLevel
import Data.Word

type TestStruct = Struct (Word16 :& Word32 :& Word64)
getTestPtr :: Value (Ptr TestStruct) -> CodeGenFunction r (Value (Ptr Word32))
-- getTestPtr u = getElementPtr u ((0 :: Word32) & d1 & ())
getTestPtr u = getElementPtr0 u (d1 & ())

谢谢,它可以工作。我注意到GetField typeclass需要一个类型级别号,但我正在尝试
(未定义::D1)
和一些其他错误。我在中没有看到
d1
,在Hayoo上也没有看到。@Chetan我猜hackage使用的是旧版/有缺陷的haddock版本。我本地构建的文档在
Data.TypeLevel.Num.alias中显示
d0
。尽管我认为
未定义::d0
也可以工作。谢谢,它工作了。我没有注意到GetField typeclass要求类型级别号,但我正在尝试
(未定义::D1)
和一些其他错误。我在中没有看到
d1
,在Hayoo上也没有看到。@Chetan我猜hackage使用的是旧版/有缺陷的haddock版本。我本地构建的文档在
Data.TypeLevel.Num.alias中显示
d0
。尽管我认为
未定义::d0
也可以工作。。