para full descargar compilador code blocks fortran codeblocks fortran90 gfortran

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ña Build targets check only Main.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.