[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