I am seeing what looks like a similar problem trying to use PyPlot in
version 0.4. When I issue 'using PyPlot', I get
ERROR: LoadError: LoadError: LoadError: MethodError: `convert` has no
method matching convert(::Type{Ptr{UInt8}}, ::ASCIIString)
This may have arisen from a call to the constructor Ptr{UInt8}(...),
since type constructors fall back to convert methods.
Closest candidates are:
convert{T}(::Type{Ptr{T}}, ::UInt32)
convert{T}(::Type{Ptr{T}}, ::Int32)
convert{T}(::Type{Ptr{T}}, ::Ptr{T})
in call at /home/ian/.julia/v0.4/PyCall/src/pytype.jl:92.
I made a couple of feeble attempts to fix this but no luck.
julia> versioninfo()
Julia Version 0.4.0-dev+3825
Commit 8cb0c50* (2015-03-14 23:55 UTC)
Platform Info:
System: Linux (i686-linux-gnu)
CPU: Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz
WORD_SIZE: 32
BLAS: libopenblas (DYNAMIC_ARCH NO_AFFINITY Penryn)
LAPACK: libopenblas
LIBM: libopenlibm
LLVM: libLLVM-3.3
Ian
On Friday, March 13, 2015 at 1:56:03 PM UTC-4, René Donner wrote:
>
> That string does represent a filename, doesn't it? Do you obtain that by
> calling readdir() at some point perhaps? This can now return a
> Array{Union(UTF8String,ASCIIString),1}, which I believe was not the case in
> 0.3. (At least I had to adapt my code at some point to deal with this)
>
>
>
> Am 13.03.2015 um 18:43 schrieb Phil Tomson <[email protected]
> <javascript:>>:
>
> >
> >
> > On Thursday, March 12, 2015 at 9:00:45 PM UTC-7, Avik Sengupta wrote:
> > I think this is simply due to your passing a UTF8String, while your
> function defined only for ASCIIString. Since there is no function defined
> for UTF8String, julia falls back to the default constructor that calls
> convert.
> >
> > julia> type A
> > a::ASCIIString
> > b::Int
> > end
> >
> > julia> function A(fn::ASCIIString)
> > A(fn, length(fn)
> > end
> > ERROR: syntax: missing comma or ) in argument list
> >
> > julia> function A(fn::ASCIIString)
> > A(fn, length(fn))
> > end
> > A
> >
> > julia> A("X")
> > A("X",1)
> >
> > julia> A("∞")
> > ERROR: MethodError: `convert` has no method matching convert(::Type{A},
> ::UTF8String)
> > This may have arisen from a call to the constructor A(...),
> > since type constructors fall back to convert methods.
> > Closest candidates are:
> > convert{T}(::Type{T}, ::T)
> >
> > in call at no file
> >
> >
> > #Now try this:
> >
> > julia> type A
> > a::AbstractString
> > b::Int
> > end
> >
> > julia> function A(fn::AbstractString)
> > A(fn, length(fn))
> > end
> > A
> >
> > julia> A("X")
> > A("X",1)
> >
> > julia> A("∞")
> > A("∞",1)
> >
> > Not that using AbstractString is only one way to solve this, which may
> or may not be appropriate for your use case. The code above is simply to
> demonstrate the issue at hand.
> >
> >
> > Why would this have changed in 0.4, though?
> >
> > Running in Julia 0.4:
> > julia> typeof("string")
> > ASCIIString
> >
> > so a quoted string still has the same type as it did before.
> >
> >
> >
> >
> >
> > On Thursday, 12 March 2015 23:43:58 UTC, Phil Tomson wrote:
> > I thought I'd give 0.4 a spin to try out the new garbage collector.
> >
> > On my current codebase developed with 0.3 I ran into several warnings
> (float32() should now be Float32() - that sort of thing)
> >
> > And then this error:
> >
> > ERROR: LoadError: LoadError: LoadError: LoadError: LoadError:
> MethodError: `convert` has no method matching convert(::Type{Img.ImgHSV},
> ::UTF8String)
> > This may have arisen from a call to the constructor Img.ImgHSV(...),
> > since type constructors fall back to convert methods.
> > Closest candidates are:
> > convert{T}(::Type{T}, ::T)
> >
> > After poking around New Language Features and the list here a bit it
> seems that there are changes to how overloaded constructors work.
> >
> > In my case I've got:
> >
> > type ImgHSV
> > name::ASCIIString
> > data::Array{HSV{Float32},2}
> > #data::Array{IntHSV,2}
> > height::Int64
> > wid::Int64
> > h_mean::Float32
> > s_mean::Float32
> > v_mean::Float32
> > h_std::Float32
> > s_std::Float32
> > v_std::Float32
> > end
> >
> > # Given a filename of an image file, construct an ImgHSV
> > function ImgHSV(fn::ASCIIString)
> > name,ext = splitext(basename(fn))
> > source_img_hsv = Images.data(convert(Image{HSV{Float64}},imread(fn)))
> > #scale all the values up from (0->1) to (0->255)
> > source_img_scaled = map(x-> HSV( ((x.h/360)*255),(x.s*255),(x.v*255)),
> > source_img_hsv)
> > img_ht = size(source_img_hsv,2)
> > img_wid = size(source_img_hsv,1)
> > h_mean = (mean(map(x-> x.h,source_img_hsv)/360)*255)
> > s_mean = (mean(map(x-> x.s,source_img_hsv))*255)
> > v_mean = (mean(map(x-> x.v,source_img_hsv))*255)
> > h_std = (std(map(x-> x.h,source_img_hsv)/360)*255)
> > s_std = (std(map(x-> x.s,source_img_hsv))*255)
> > v_std = (std(map(x-> x.v,source_img_hsv))*255)
> > ImgHSV(
> > name,
> > float32(source_img_scaled),
> > img_ht,
> > img_wid,
> > h_mean,
> > s_mean,
> > v_mean,
> > h_std,
> > s_std,
> > v_std
> > )
> > end
> >
> > Should I rename this function to something like buildImgHSV so it's not
> actually a constructor and convert doesn't enter the picture?
> >
> > Phil
>
>