You are missing & in ccall for variables that put as Int64 but expected to
be passed as Ptr{Int64}.
ccall( (:gcvspl_, "./libgcvspl.so"), Void, (Ptr{Float64},Ptr{Float64},Ptr{
Int64},Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Int64},Ptr{Int64},Ptr{Int64
},Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Float64},Ptr{Int64}),x,y,&NN,wx,
wy,&M,&N,&K,&MD,VAL,c,&NC,WK,&IER)
I would make IER one element array since it needs to be retrieved as output.
IER=Int64[0]
then it is
ccall( (:gcvspl_, "./libgcvspl.so"), Void, (Ptr{Float64},Ptr{Float64},Ptr{
Int64},Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Int64},Ptr{Int64},Ptr{Int64
},Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Float64},Ptr{Int64}),x,y,&NN,wx,
wy,&M,&N,&K,&MD,VAL,c,&NC,WK,IER)
On Monday, June 6, 2016 at 6:22:47 AM UTC+3, Charles Ll wrote:
>
> Dear all,
>
> I am trying to call some Fortran code in Julia, but I have a hard time
> doing so... I have read the docs, looked at the wrapping of ARPACK and
> other libraries... But I did not find any way to make it work.
>
> I am trying to wrap a spline function library (gcvspl.f,
> https://github.com/charlesll/Spectra.jl/tree/master/Dependencies), which
> I want to use in my project, Spectra.jl.
>
> I already have a wrapper in Python, but this was easier to wrap with using
> f2py. In Julia, I understand that I have to do it properly. The function I
> am trying to call is:
> GCVSPL ( X, Y, NY, WX, WY, M, N, K, MD, VAL, C, NC, WK, IER) (LINE 42 of
> GCVSPL.f)
>
>
> X(N) ( I ) Independent variables, Float64
> Y(NY,K) ( I ) Input data to be smoothed (or interpolated), Float64
> NY ( I ) First dimension of array Y(NY,K), with NY.ge.N,
> Integer
> WX(N) ( I ) Weight factor array, Float64
> WY(K) ( I ) Weight factor array, Float64
> M ( I ) M = 1,2,3,4 correspond to linear, cubic, quintic
> , and heptic splines, respectively. Integer
> N ( I ) Number of observations per dataset, Integer
> K ( I ) Number of datasets, with K.ge.1., Integer
> MD ( I ) Optimization mode switch, Integer
> VAL ( I ) Mode value, as described above under MD., Array of
> Float64
> C(NC,K) ( O ) Spline coefficients, Array of Float64
> NC ( I ) First dimension of array C(NC,K), NC.ge.N., Integer
> WK(IWK) (I/W/O) Work vector, IWK.ge.6*(N*M+1)+N, Array of Float64
> IER ( O ) Error parameter, Integer
>
> with I and O designating Inputs and Outputs, respectively. From this and
> my previous Python wrap, I generated a fake dataset and tried to use this
> function with ccall:
>
> x = collect(0.0:1.0:100)
> y = 2.0.*x.^2 - 100.0 + x +0.0003.*x.^5
> ese = y./10000
>
>
> NN::Int64 = length(y)
> wx = 1./(ese.^2) # relative variance of observations
> wy = zeros([1])+1 # systematic errors... not used so put them to 1, works
> under the Python wrap
> VAL = ese.^2
>
>
> M::Int64 = 2
> N::Int64 = length(x)
> K::Int64 = 1 # number of y columns
> MD::Int64 = 2 #spline mode
> NC::Int64 = length(y)
>
> # initialising stuffs for outputs... isit the right way?
> c = ones(NN,NC)
> WK = [1.,1.,1.,1.,1.,1.]
> IER::Int64 = 0
>
>
> ccall( (:gcvspl_, "./libgcvspl.so"), Void, (Ptr{Float64},Ptr{Float64},Ptr{
> Int64},Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Int64},Ptr{Int64},Ptr{
> Int64},Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Float64},Ptr{Int64}),x,y,
> NN,wx,wy,M,N,K,MD,VAL,c,NN,WK,IER)
>
> This code does not work, returning me some convert problems... Notably, I
> get this one:
>
> LoadError: MethodError: `convert` has no method matching
> convert(::Type{Ptr{Float64}}, ::Array{Int64,1})
>
>
> That I don't understand... In the "examples" (code already wrapped...)
> available online, that was the way people wrapped stuffs...
>
> Do anyone has some clue about doing this wrapping? The gcvspl.f code is
> available in
> https://github.com/charlesll/Spectra.jl/tree/master/Dependencies .
>
> Thanks in advance!
>
> Best,
> Charles.
>
>
>