On Mon, Oct 26, 2015 at 11:58 PM, Taylor Maxwell
<taylor.maxw...@gmail.com> wrote:
> I am moving some of my code to 0.4 and I am having trouble figuring out how
> to get a pointer for beginning of a UInt matrix.  In the past I did:
>
> julia> bpt = convert(Ptr{Uint8},b)  #where b it my Uint8 matrix
>
> Ptr{Uint8} @0x00007fdd243fca70
>
>
> in 0.4 I get:
>
> julia> bpt = convert(Ptr{UInt8},b)
>
> ERROR: MethodError: `convert` has no method matching
> convert(::Type{Ptr{UInt8}}, ::Array{UInt8,1})
>
> This may have arisen from a call to the constructor Ptr{UInt8}(...),
>
> since type constructors fall back to convert methods.
>
> Closest candidates are:
>
>   call{T}(::Type{T}, ::Any)
>
>   convert{T<:Union{Int8,UInt8}}(::Type{Ptr{T<:Union{Int8,UInt8}}},
> ::Cstring)
>
>   convert{T}(::Type{Ptr{T}}, ::UInt64)
>
>
> Unfortunately I am not certain any of these options match what I am looking
> for:
>
> The method used in 0.3 is:
> convert{T}(::Type{Ptr{T}},a::Array{T,N}) at pointer.jl:22
> which is:
> convert{T}(::Type{Ptr{T}}, a::Array{T}) = ccall(:jl_array_ptr, Ptr{T},
> (Any,), a)
> this obviously does not exist in 0.4.
>
> My use case is that I read in a Uint8 matrix from a PLINK .bed file format
> which is a Uint8 matrix that is a dense way to pack in genetic locus
> genotypes every two bits and every column represents a new locus.  With the
> pointer at the beginning of the Uint8 matrix, I can easily work my way down
> a column and extract the genotype calls with bit operations across the
> matrix.  This kind of work is at the edge of my understanding (i.e. pointers
> and bit operations) so despite looking at some of the code for the suggested
> convert methods I am not sure how to get back to what I originally use with
> what is available in 0.4.
>
> In 0.4 I can just make my own new convert call with the old code from 0.3
> by:
> import Base.convert
> convert{T}(::Type{Ptr{T}}, a::Array{T}) = ccall(:jl_array_ptr, Ptr{T},
> (Any,), a)
> and it get:
>
> julia> bpt = convert(Ptr{UInt8},b)
>
> Ptr{UInt8} @0x000000011253ac00
>

You shouldn't need to do this. This is replaced by
`Base.unsafe_convert` for `ccall`

```
julia> Base.unsafe_convert(Ptr{Int}, Int[])
Ptr{Int64} @0x00007f4e032fb700
```

See the doc for why this is changed
http://julia.readthedocs.org/en/latest/manual/calling-c-and-fortran-code/#garbage-collection-safety

There's also `pointer(::Array)` that should have the same effect.

However, breifly looking at your use case, I think you should use
SubArray / ArrayView, or reinterpret the array, or Ref of an array
element if you are calling c function to work with it.

>
> But I wanted to know if the was a technical reason for that convert call to
> be removed in 0.4 and if using this "reinstated" convert call will do what
> it originally did in 0.3.
>
>

Reply via email to