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

_______________________________________________
R-br mailing list
R-br@listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código 
mínimo reproduzível.

Responder a