
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