Hi, 

I got an answer. You need to use Cfloat for REAL instead of Cdouble for 
DOUBLE PRECISION.



On Wednesday, August 5, 2015 at 6:01:05 PM UTC-4, Byung Lee wrote:
>
> Hi,
>
> When I tried the following Fortran routine (abc.f), it worked using the 
> following shared file and ccall.
> But when I tried after changing  DOUBLE PRECISION with REAL, it did not 
> work. How should it be fixed.
>
> This is what I saw on the Internet and worked:
>  
> abc.f file I saw on the Internet
>
>        SUBROUTINE MULTIPLY(A,B,C)
>         DOUBLE PRECISION A,B,C
>         C = A*B
>         RETURN
>         END
>
> gfortran abc.f -o abc.so -shared -fPIC
>
> a = 2.0
> b = 4.2
> n = Float64[1.0]
>  
>   ccall((:multiply_, "abc.so"), Void, 
> (Ptr{Float64},Ptr{Float64},Ptr{Float64}),&a,&b, n)
>
> julia> n
> 1-element Array{Float64,1}:
>  8.4
>
> Again ccall worked with DOUBLE PRECISION.
>
> When I used REAL like the following:
>       SUBROUTINE MULTIPLY(A,B,C)
>         DOUBLE PRECISION A,B,C
>         C = A*B
>         RETURN
>         END
>
> and used the same procedure like
>
> gfortran abc.f -o abc.so -shared -fPIC
>
> a = 2.0
> b = 4.2
> julia> n = Array(Float64)
> 0-dimensional Array{Float64,0}:
> 0.0
>
> julia> ccall((:multiply_, "/fullPathTo/abc.so"), Void,  
> (Ptr{Float64},Ptr{Float64},Ptr{Float64}), &a,  &b, n)
>
> julia> n
> 0-dimensional Array{Float64,0}:
> 1.061e-314
>
> The default value of 0.0 changed to 1.061e-314, which is not the correct 
> answer.
>
> When I assigned a specific number to n:
> julia> n = Float64[1.0]
> 1-element Array{Float64,1}:
>  1.0
>
> julia> ccall((:multiply_, "/fullPathTo/abc.so"), Void,  
> (Ptr{Float64},Ptr{Float64},Ptr{Float64}), &a,  &b, n)
>
> Then the array element value was not changed.
> julia> n
> 1-element Array{Float64,1}:
>  1.0
>
> I am wondering why it does not work with REAL variables.
> I tried Logical, Int, and Character variables, along with Double Precision.
> All worked, except for REAL.
>
> Thanks,
>
> Byung Lee
>
>
>
>
> On Friday, November 14, 2014 at 4:08:50 PM UTC-5, Andre Bieler wrote:
>>
>> tried calling a simple fortran function from julia but did not succeed:
>> this is the fortran code:
>>
>> !fileName = simplemodule.f95
>> module simpleModule
>>
>> contains
>> function foo(x)
>>   integer :: foo, x
>>   foo = x * 2
>> end function foo
>>
>>
>> end module simplemodule
>>
>>
>> which is then compiled with:
>>
>> *gfortran simplemodule.f95 -o simplemodule.so -shared -fPIC*
>>
>> and finally the julia call is:
>>
>>
>> ccall((:foo, "/fullPathTo/simpleMod.so"), Int32, (Int32,), 3)
>>
>>
>> which then leads to the following error:
>>
>> ERROR: ccall: could not find function foo in library 
>> /fullPathTo/simpleMod.so
>>  in anonymous at no file
>>
>>
>>
>> when compiling with:
>>
>> gfortran -c simplemodule.f95 -o simplemodule.so -shared -fPIC
>>
>> i get a different error:
>>
>> *ERROR: error compiling anonymous: could not load module 
>> /fullPathTo/simplemodule.so: /fullPathTo/simplemodule.so:*
>> *only ET_DYN and ET_EXEC can be loaded*
>>
>>
>>
>> Can anyone tell me what I am missing?
>> I do realize I would not need to call fortran to multiply a variable by 
>> 2, but its a starting point..
>>
>>
>> Thanks!
>> Andre
>>
>

Reply via email to