fortran - full - descargar mingw para codeblocks
Problema GFortran y CodeBlocks con módulos y archivos múltiples (3)
Asumiendo que lo que ha escrito es cómo es su código, entonces parece que el problema es que la module mesh
del module mesh
está dentro del programa principal y no en un archivo separado. Debería tener tres archivos: Mesh.f90
, Derivatives.f90
y Main.f90
.
Mesh.f90 es exactamente como lo tienes,
module Mesh
implicit none
integer :: IMAX,JMAX,NMAX
real(8), allocatable :: XD(:),YD(:),FX(:,:),FY(:,:)
real(8) :: PI,E,DX,DY,H,L,RHO,MU
parameter (PI = ACOS(-1.D0))
parameter (E = 2.718)
end module Mesh
Derivatives.f90 debe escribirse como otro módulo, que contains
:
module Derivatives
use mesh
contains
real(8) function dfdx(f,i)
real(8) :: f(i:imax)
integer :: i
DfDx=(f(i+1)-f(i-1))/(2d0*dx)
end function dfdx
end module Derivatives
y Main.f90 luego use
ambos módulos. Tenga en cuenta que tuve que eliminar la variable DfDx
; esto es porque entra en conflicto con la function DfDx
en el module Derivatives
program Cavity
Use Mesh
use Derivatives
implicit none
Real(8), Allocatable :: func(:)
Real(8) :: Der
integer :: i
IMAX=10
DX=1./10
Allocate(xd(IMAX),func(IMAX))
Do i=1,IMAX
xd(i)=i*DX
End Do
Do i=1,IMAX
func(i) = xd(i)**2
End Do
Der=Dfdx(func,2)
Write(*,*) Der
End program Cavity
No sé cómo funciona CodeBlocks, pero supongo que le permite elegir el orden de compilación. Si ese es el caso, primero debe compilar Mesh.f90, luego Derivatives.f90, luego compilar Main.f90 antes de vincularlos a un ejecutable.
Cuando los compilé y los vinculé, obtuve una respuesta de 0.200000002980232; con suerte eso se vincula también con lo que tienes.
Estoy trabajando con GFortran y CodeBlocks, pero tengo un problema con los módulos y varios archivos. Sigo recibiendo este error:
Fatal Error: Can''t open module file ''mesh.mod'' for reading at (1): No such file or directory
Por alguna razón, GFortran no está compilando el archivo ''mesh.mod''. Este problema no ocurre cuando coloco todo el código en un solo archivo .f90.
Bellow es un ejemplo de código que ocurre este error.
main.f90
MODULE MESH
IMPLICIT NONE
INTEGER :: IMAX,JMAX,NMAX
REAL(8), ALLOCATABLE :: XD(:),YD(:),FX(:,:),FY(:,:)
REAL(8) :: PI,E,DX,DY,H,L,RHO,MU
PARAMETER (PI = ACOS(-1.D0))
PARAMETER (E = 2.718)
END MODULE MESH
!**************************************************************
program Cavity
Use Mesh
implicit none
Real(8), Allocatable :: func(:)
Real(8) :: Der,DfDx
integer :: i
IMAX=10
DX=1./10
Allocate(xd(IMAX),func(IMAX))
Do i=1,IMAX
xd(i)=i*DX
End Do
Do i=1,IMAX
func(i) = xd(i)**2
End Do
Der=Dfdx(func,2)
Write(*,*) Der
End program Cavity
Derivatives.f90
Real(8) Function DfDx(f,i)
Use Mesh
implicit none
Real(8) :: f(1:Imax)
integer :: i
DfDx=(f(i+1)-f(i-1))/(2d0*dx)
return
end function DfDx
Cuando uso la compilación de línea de comandos de consola en lugar de la interfaz CodeBlocks, ya resolví este problema ( compilando varios archivos con módulos ) pero sigo teniendo este problema con CodeBlocks.
¿Alguien sabe cómo resolver este problema?
El problema es que en CodeBlocks "los proyectos se construyen en el orden de aparición, de arriba a abajo " ( Wiki CodeBlocks ), en otras palabras, los archivos se compilan alfabéticamente. Lo que significa que en mi caso, Derivatives.f90 se estaba compilando antes que Main.f90, lo que causaba el error.
Una forma de eludir el problema es establecer solo el archivo Main.f90
como destino de compilación en CodeBlocks:
- Menú
Project/Properties...
- En
Build Target Files
en la pestañaBuild targets
check onlyMain.f90
Y use el comando Include ''File_Name.f90''
dentro del código Main.f90
para incluir los otros archivos f90
para compilación en el orden correcto.
En Codeblock, puede ir a Propiedades del proyecto> Objetivos de compilación. Luego seleccione primero el archivo que desea construir (por ejemplo, mod.f90). En "Propiedades de archivo seleccionadas" vaya a "Crear" Aquí, cambie el peso de prioridad. Un peso menor implica que el archivo se construirá primero.