fortran - raphson - Falta la interfaz explícita para la subrutina
newton raphson fortran (2)
Coloque su subrutina File2Arr
dentro del módulo MyData
(y elimine el use mydata
línea use mydata
dentro de esa subrutina). Se compiló y funcionó para mí haciendo eso.
Solo quiero leer un archivo de texto de dos columnas con líneas variables en una matriz. La primera columna del archivo de texto es el tiempo en la unidad de segundo, y el segundo es la temperatura. Solo así:
1.1 10
2.1 20
3.2 30
4.2 40
5.3 50
6.3 60
7.4 70
A continuación está el código que escribo:
module myData type line_info real :: time real :: temp end type type datalink type(line_info) :: time_temp type(datalink), pointer :: next end type type(line_info), allocatable :: FileInfoArr(:) end module program Console1 use myData implicit none ! Variables type(line_info),allocatable :: time_temp_arr(:) !real,allocatable :: File2Arr(:) character (len=80) :: FileFullName="C:/t.txt" call File2Arr(FileFullName,time_temp_arr) End Program Console1 Subroutine File2Arr(FileFullName,InfoArray) use myData character (len=80) :: FileFullName type(line_info),allocatable :: InfoArray(:) type(datalink), pointer :: head type(datalink), pointer :: p integer error,size,i logical alive ! check if file exists inquire(file=FileFullName, exist=alive) if(alive==0) then write(*,*) FileFullName, "doesn''t exist." stop end if ! read file using pointer open(10, file=FileFullName, status="old", iostat=error) if(error/=0) then write(*,*) "open file fail!" stop end if allocate(head) nullify(head%next) p=>head size=0 !read(10,"(A80)") tempstr do while(.true.) read(10, fmt=*, iostat=error) p%time_temp if(error/=0) exit size=size+1 allocate(p%next, stat=error) ! add next line if(error/=0) then write(*,*) "Out of memory!" stop end if p=>p%next nullify(p%next) end do !save link info into an array allocate(InfoArray(size)) p=>head i=0 do while(associated(p%next)) i=i+1 InfoArray(i)=p%time_temp p=>p%next !write(*,*) FileInfoArr(i)%time, FileInfoArr(i)%temp end do End Subroutine
Cuando lo compilo, obtuve esto:
error # 8055: El procedimiento tiene un argumento ficticio que tiene el atributo ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE o VOLATILE. La interfaz explícita requerida falta en la fuente original. [TIME_TEMP_ARR]
Alguna idea sobre cómo solucionar este error, gracias por cualquier ayuda.
Como alternativa a agregar su subrutina File2Arr
a su módulo MyData
, puede ponerla también directamente en su programa utilizando la palabra clave CONTAINS
(aquí también puede eliminar el use mydata
en la subrutina).