Cfloat is just an alias for Float32, to make it easier to match up type 
signatures in ccalls. The same is true for the other C-prefixed types. 
Which to prefer in a ccall is a matter of style.

On Thursday, August 6, 2015 at 8:30:43 AM UTC-5, Byung Lee wrote:
>
> Not only Cfloat, but also Float32 worked, like Cfloat[1.2] OR 
> Float32[1.1]. 
>
>
> On Thursday, August 6, 2015 at 9:13:58 AM UTC-4, Byung Lee wrote:
>>
>> 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