[R-br] Fortran 90 + R: como carregar a dll

Cleber N.Borges klebyn em yahoo.com.br
Quinta Outubro 3 12:55:47 BRT 2013


obrigado Elias pelo help,

compilei o codigo com sua modificação.
Não gera nenhum erro porém gera um resultado absurdo aqui na minha máquina.

Reproduza abaixo:
############################################

 > system("gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o")
 > system("gfortran -m64 -shared -s -static-libgcc -o contador.dll 
contador.o")
 > dyn.load('contador.dll')
 > is.loaded('contador')
[1] TRUE
 >
 > getNativeSymbolInfo('contador')
$name
[1] "contador"

$address
<pointer: 0x00000000100c1450>
attr(,"class")
[1] "NativeSymbol"

$package
NULL

attr(,"class")
[1] "NativeSymbolInfo"
 >
 >
 > .Fortran('contador', n=as.integer(5), r=numeric(5))
$n
[1] 5

$r
[1] 8.487983e-314 3.395193e-313 1.235164e-322  0.000000e+00 0.000000e+00

 >

obrigado novamente
cleber



Em 03/10/2013 04:57, Elias T Krainski escreveu:
> Oi Cleber,
>
> Nao sei qual foi o problema. So' gostaria de questionar: porque voce 
> esta lendo o tamanho do vetor?
>
> Ate onde sei, e' melhor declarar objetos no R e passa-los a subrotina. 
> No seu caso, poderia ser
>
>
>         subroutine contador(n,r)
>         ! Compilar como dynamic library para uso no R
>         integer n, i
>         integer r(n)
>         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>         do i = 1, n
>             r(i) = i
>         enddo
>         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>         end subroutine
>
> e para mim funcionou bem (em Linux, of course) :)
>
> On 10/03/2013 01:16 AM, Cleber N.Borges wrote:
>> olá a todos,
>>
>> estou tentando aprender o básico de como construir um código em Fortran
>> e usá-lo no R.
>>
>> Para tanto, criei o segundo código em Fortran:
>> ------------------------------------------------------------------------------------------------
>>         subroutine contador
>>         ! Compilar como DLL para uso no R
>>         implicit none
>>         integer n, i
>>         integer, allocatable :: r(:)
>>         read *, n
>>         allocate( r(n) )
>>         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>         do i = 1, n
>>             r(i) = i
>>         enddo
>>         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>         end subroutine
>> ------------------------------------------------------------------------------------------------
>>
>> No prompt do DOS, eu fui tentar usar o comando:  R CMD SHLIB contador.f90
>> e obtive o seguinte erro:
>>
>> ------------------------------------------------------------------------------------------------
>> C:\Users\CLEBER\Documents\code\contador>R CMD SHLIB contador.f90
>> C:/R/etc/x64/Makeconf:196: warning: overriding commands for target `.m.o'
>> C:/R/etc/x64/Makeconf:189: warning: ignoring old commands for target 
>> `.m.o'
>> gfortran -m64   -O2  -mtune=core2 -c  contador.f90 -o contador.o
>> gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def 
>> contador.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 
>> -Ld:/RCompile/CRANpkg/extralibs64/local/lib  -LC:/R/bin/x64 -lR
>> /usr/bin/sh: line 8: gfortran -m64: command not found
>> ------------------------------------------------------------------------------------------------
>>
>> não entendi o motivo do erro...
>>
>> Gostaria de alguma ajuda nesse Ponto (1) <- ***
>>
>> Contornei o problema "Copiando & Colando" os comandos no prompt.
>>
>> O arquivo * tmp.def * não existe... mas
>> então eu o criei por que havia compilado anteriormente com a IDE Code 
>> Blocks, e sabia da existência de um fulano *libcontador.def*
>>
>> +++++++++++++++++++++++++++++
>> o conteúdo de def é apenas:
>> EXPORTS
>>     contador_ @1
>> +++++++++++++++++++++++++++++
>>
>> ------------------------------------------------------------------------------------------------
>> gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o
>> gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def 
>> contador.o -Ld:/RCompile/CRANpkANpkg/extralibs64/local/lib 
>> -LC:/R/bin/x64 -lR
>> ------------------------------------------------------------------------------------------------
>>
>> Após os comandos acima é gerado o arquivo contador.dll
>>
>> No R, eu fui tentar carregar a dll, assim:
>>
>> >
>> > dyn.load('contador.dll')
>> >
>> > dlls <- getLoadedDLLs()
>> > dlls
>>                                                       Filename 
>> Dynamic.Lookup
>> base base          FALSE
>> utils C:/R/library/utils/libs/x64/utils.dll          FALSE
>> methods C:/R/library/methods/libs/x64/methods.dll          FALSE
>> grDevices C:/R/library/grDevices/libs/x64/grDevices.dll          FALSE
>> graphics C:/R/library/graphics/libs/x64/graphics.dll          FALSE
>> stats C:/R/library/stats/libs/x64/stats.dll          FALSE
>> contador C:/Users/CLEBER/Documents/code/contador/contador.dll TRUE
>> >
>> > getDLLRegisteredRoutines('contador')
>> data frame with 0 columns and 0 rows
>> >
>> >
>>
>> Porém não há registro da subrotina 'contador'... :-(
>>
>>
>> Usei o comando:   .Fortran('contador_', n=as.integer( 10 ) )
>>
>> mas daí trava o R.
>>
>>
>> Se alguém puder me ajudar a entender isso, agradeço desde já.
>>
>>
>> cleber
>>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20131003/cf3db1fd/attachment.html>


Mais detalhes sobre a lista de discussão R-br