【问题标题】:`unsafe_convert` fails for array views with `Vector{U}` for indices instead of `UnitRange{U}` in Julia`unsafe_convert` 在 Julia 中使用 `Vector{U}` 索引而不是 `UnitRange{U}` 的数组视图失败
【发布时间】:2022-07-07 23:27:54
【问题描述】:

在处理具有由索引向量而不是 UnitRange 给出的索引的视图时,我注意到以下错误。

c = rand(10)
c1 = view(c, [1, 3])
c2 = view(c1, 2:2)
Base.unsafe_convert(Ptr{Float64}, c2)

现在返回

ERROR: conversion to pointer not defined for SubArray{Float64, 1, Vector{Float64}, Tuple{Vector{Int64}}, false}
Stacktrace:
 [1] error(s::String)
   @ Base ./error.jl:33
 [2] unsafe_convert(#unused#::Type{Ptr{Float64}}, a::SubArray{Float64, 1, Vector{Float64}, Tuple{Vector{Int64}}, false})
   @ Base ./pointer.jl:67
 [3] top-level scope
   @ REPL[6]:1

【问题讨论】:

    标签: arrays type-conversion julia


    【解决方案1】:

    它们都对我产生了相同的错误(即,对于非连续视图,明确禁止使用指针——由 false 类型参数指示):

    julia> Base.unsafe_convert(Ptr{Float64}, c1)
    ERROR: conversion to pointer not defined for SubArray{Float64, 1, Vector{Float64}, Tuple{Vector{Int64}}, false}
    Stacktrace:
     [1] error(s::String)
       @ Base ./error.jl:33
     [2] unsafe_convert(#unused#::Type{Ptr{Float64}}, a::SubArray{Float64, 1, Vector{Float64}, Tuple{Vector{Int64}}, false})
       @ Base ./pointer.jl:67
     [3] top-level scope
       @ REPL[8]:1
    
    julia> Base.unsafe_convert(Ptr{Float64}, c2)
    ERROR: conversion to pointer not defined for SubArray{Float64, 1, Vector{Float64}, Tuple{Vector{Int64}}, false}
    Stacktrace:
     [1] error(s::String)
       @ Base ./error.jl:33
     [2] unsafe_convert(#unused#::Type{Ptr{Float64}}, a::SubArray{Float64, 1, Vector{Float64}, Tuple{Vector{Int64}}, false})
       @ Base ./pointer.jl:67
     [3] top-level scope
       @ REPL[9]:1
    

    这是有道理的,因为指向非连续块的指针没有真正意义(有关所选索引的信息丢失)。

    不过,您可以获得范围的指针:

    julia> Base.unsafe_convert(Ptr{Float64}, view(c, 2:2))
    Ptr{Float64} @0x00007f1feaa58b88
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2017-08-20
      • 2018-08-26
      相关资源
      最近更新 更多