Re: [julia-users] correct typing for unsafe_wrap

2016-08-21 Thread Andreas Lobinger
Hello,

On Sunday, August 21, 2016 at 1:16:22 PM UTC+2, Milan Bouchet-Valat wrote:
>
> Le dimanche 21 août 2016 à 01:36 -0700, Andreas Lobinger a écrit : 
> > Hello colleagues, 
> > 
> > i'm trying to use unsafe_wrap from a pointer from an external call 
> > (cfunction) to an array access. 
> > Looks like i have type problems: 
>
> The problem is with the first argument: it should be a type, not an 
> array. You should simply pass 'Array' instead of 'b1': no need to 
> allocate a buffer, as this function uses the original memory referred 
> to by the pointer (without making a copy). 
>

i pass Array{UInt8,1} and this works.

Thank you and wishing a happy sunday,
   Andreas 


Re: [julia-users] correct typing for unsafe_wrap

2016-08-21 Thread Milan Bouchet-Valat
Le dimanche 21 août 2016 à 01:36 -0700, Andreas Lobinger a écrit :
> Hello colleagues,
> 
> i'm trying to use unsafe_wrap from a pointer from an external call
> (cfunction) to an array access.
> Looks like i have type problems:
> 
> 
> 
> function read_from_stream_callback(s::IO, buf::Ptr{UInt8},
> len::UInt32)
> 
>     #b1 = zeros(UInt8,len)
>     #nb = readbytes!(s,b1,len)
>     
>     #for i=1:len
>     #    unsafe_store!(buf,b1[i],i)
>     #end
> 
>     b1 = zeros(UInt8,len)
>     unsafe_wrap(b1,buf,len)
>     nb = readbytes!(s,b1,len)
> 
>     @compat(Int32(0))
> end
> 
>    _
>    _   _ _(_)_ |  A fresh approach to technical computing
>   (_) | (_) (_)    |  Documentation: http://docs.julialang.org
>    _ _   _| |_  __ _   |  Type "?help" for help.
>   | | | | | | |/ _` |  |
>   | | |_| | | | (_| |  |  Version 0.5.0-rc2+0 (2016-08-12 11:25 UTC)
>  _/ |\__'_|_|_|\__'_|  |  
> |__/   |  x86_64-linux-gnu
> 
> julia> include("png_stream.jl")
> ERROR: LoadError: MethodError: no method matching
> unsafe_wrap(::Array{UInt8,1}, ::Ptr{UInt8}, ::UInt32)
> Closest candidates are:
>   unsafe_wrap(::Type{String}, ::Union{Ptr{Int8},Ptr{UInt8}},
> ::Integer) at pointer.jl:86
>   unsafe_wrap(::Type{String}, ::Union{Ptr{Int8},Ptr{UInt8}},
> ::Integer, ::Bool) at pointer.jl:86
>  
> unsafe_wrap{T}(::Union{Type{Array{T,1}},Type{Array{T,N}},Type{Array}}
> , ::Ptr{T}, ::Integer) at pointer.jl:57
>   ...
>  in
> read_from_stream_callback(::Base.AbstractIOBuffer{Array{UInt8,1}},
> ::Ptr{UInt8}, ::UInt32) at /home/lobi/juliarepo/png_stream.jl:16
>  in read_png_from_stream(::Base.AbstractIOBuffer{Array{UInt8,1}}) at
> /home/lobi/juliarepo/png_stream.jl:26
>  in include_from_node1(::String) at ./loading.jl:426
> while loading /home/lobi/juliarepo/png_stream.jl, in expression
> starting on line 55
> 
> to which i somehow disagree (as long as UInt32 is an Integer).
> 
> the commented code runs correctly (copy to but UInt8 seq.)
> 
> A better explaination of the error?
The problem is with the first argument: it should be a type, not an
array. You should simply pass 'Array' instead of 'b1': no need to
allocate a buffer, as this function uses the original memory referred
to by the pointer (without making a copy).


Regards

> Wishing a happy day,
>     Andreas
> 
> 


[julia-users] correct typing for unsafe_wrap

2016-08-21 Thread Andreas Lobinger
Hello colleagues,

i'm trying to use unsafe_wrap from a pointer from an external call 
(cfunction) to an array access.
Looks like i have type problems:



function read_from_stream_callback(s::IO, buf::Ptr{UInt8}, len::UInt32)

#b1 = zeros(UInt8,len)
#nb = readbytes!(s,b1,len)

#for i=1:len
#unsafe_store!(buf,b1[i],i)
#end

b1 = zeros(UInt8,len)
unsafe_wrap(b1,buf,len)
nb = readbytes!(s,b1,len)

@compat(Int32(0))
end

   _
   _   _ _(_)_ |  A fresh approach to technical computing
  (_) | (_) (_)|  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.5.0-rc2+0 (2016-08-12 11:25 UTC)
 _/ |\__'_|_|_|\__'_|  |  
|__/   |  x86_64-linux-gnu

julia> include("png_stream.jl")
ERROR: LoadError: MethodError: no method matching 
unsafe_wrap(::Array{UInt8,1}, ::Ptr{UInt8}, ::UInt32)
Closest candidates are:
  unsafe_wrap(::Type{String}, ::Union{Ptr{Int8},Ptr{UInt8}}, ::Integer) at 
pointer.jl:86
  unsafe_wrap(::Type{String}, ::Union{Ptr{Int8},Ptr{UInt8}}, ::Integer, 
::Bool) at pointer.jl:86
  unsafe_wrap{T}(::Union{Type{Array{T,1}},Type{Array{T,N}},Type{Array}}, 
::Ptr{T}, ::Integer) at pointer.jl:57
  ...
 in read_from_stream_callback(::Base.AbstractIOBuffer{Array{UInt8,1}}, 
::Ptr{UInt8}, ::UInt32) at /home/lobi/juliarepo/png_stream.jl:16
 in read_png_from_stream(::Base.AbstractIOBuffer{Array{UInt8,1}}) at 
/home/lobi/juliarepo/png_stream.jl:26
 in include_from_node1(::String) at ./loading.jl:426
while loading /home/lobi/juliarepo/png_stream.jl, in expression starting on 
line 55

to which i somehow disagree (as long as UInt32 is an Integer).

the commented code runs correctly (copy to but UInt8 seq.)

A better explaination of the error?

Wishing a happy day,
Andreas