fortran call subroutine fortran95

fortran - Línea truncada, error de sintaxis en la lista de argumentos



call subroutine (2)

Cuando compilo el programa a continuación, tengo un error y una advertencia en la línea de comando de call Coor_Trans como

Advertencia: línea truncada

Error: error de sintaxis en la lista de argumentos

Compilo el programa varias veces, pero no funciona. Tal vez hay algo mal con mi comando de llamada.

program 3D implicit none integer :: i,j,k integer, parameter :: FN=2,FML=5,FMH=5 integer, parameter :: NBE=FN*FML*FMH real, parameter :: pi = 4*atan(1.0) real(kind=4), dimension(1:FN,1:FML+1,1:FMH+1) :: BEXL,BEYL,BEZL real(kind=4), dimension(1:FN,1:FML,1:FMH) :: BEXC,BEYC,BEZC,BE2A,BE2B,ANGLE real(kind=4), dimension(1:NBE,1:1,1:1) :: BEXC1,BEYC1,BEZC1,BE2A1,BE2B1,ANGLE1 real(kind=4), dimension(1:NBE,1:NBE) :: LOC_PTS1,LOC_PTS2,LOC_PTS3 real :: LOC_1,LOC_2,LOC_3 do i=1,FN do j=1,FML do k=1,FMH BEXC(i,j,k) = 0.5*(BEXL(i,j,k) + BEXL(i,j+1,k)) BEYC(i,j,k) = 0.5*(BEYL(i,j,k) + BEYL(i,j+1,k)) BEZC(i,j,k) = 0.5*(BEZL(i,j,k) + BEZL(i,j,k+1)) BE2A(i,j,k) = FL(i)/FML + j*0 + k*0 BE2B(i,j,k) = FH(i)/FMH + j*0 + k*0 ANGLE(i,j,k) = BETA(i) + j*0 + k*0 end do end do end do BEXC1 = reshape(BEXC,(/NBE,1,1/)) BEYC1 = reshape(BEYC,(/NBE,1,1/)) BEZC1 = reshape(BEZC,(/NBE,1,1/)) BE2A1 = reshape(BE2A,(/NBE,1,1/)) BE2B1 = reshape(BE2B,(/NBE,1,1/)) ANGLE1 = reshape(ANGLE,(/NBE,1,1/)) do i=1,NBE do j=1,NBE call Coor_Trans(BEXC1(i,1,1),BEYC1(i,1,1),BEZC1(i,1,1),BEXC1(j,1,1),BEYC1(j,1,1),BEZC1(j,1,1),ANGLE1(j,1,1),LOC_1,LOC_2,LOC_3) LOC_PTS1(i,j) = LOC_1 LOC_PTS2(i,j) = LOC_2 LOC_PTS3(i,j) = LOC_3 end do end do end program 3D subroutine Coor_Trans(GLOB_PTSX1,GLOB_PTSY1,GLOB_PTSZ1,GLOB_PTSX2,GLOB_PTSY2,GLOB_PTSZ2,BETA,LOC_PTS1,LOC_PTS2,LOC_PTS3) implicit none real(kind=4), intent(in) :: GLOB_PTSX1,GLOB_PTSY1,GLOB_PTSZ1,GLOB_PTSX2,GLOB_PTSY2,GLOB_PTSZ2,BETA real(kind=4), intent(out) :: LOC_PTS1,LOC_PTS2,LOC_PTS3 real, parameter :: pi = 4*atan(1.0) real :: E1,E2 E1 = cos(BETA/180*pi) E2 = sin(BETA/180*pi) LOC_PTS1 = (GLOB_PTSX1-GLOB_PTSX2)*E1 + (GLOB_PTSY1-GLOB_PTSY2)*E2 LOC_PTS2 = (GLOB_PTSZ1-GLOB_PTSZ2) LOC_PTS3 = -(GLOB_PTSX1-GLOB_PTSX2)*E2 + (GLOB_PTSY1-GLOB_PTSY2)*E1 !return end subroutine Coor_Trans


El estándar Fortran impone un límite en la longitud de la línea que los compiladores deben manejar, actualmente son 132 caracteres. Puede romper la línea en un lugar adecuado y usar una línea de continuación . Algo como esto:

call Coor_Trans(BEXC1(i,1,1),BEYC1(i,1,1),BEZC1(i,1,1),BEXC1(j,1,1), & BEYC1(j,1,1),BEZC1(j,1,1),ANGLE1(j,1,1),LOC_1,LOC_2,LOC_3)

Observe el & al final de la línea continua.

Una vez que la línea se trunca arbitrariamente, es sintácticamente errónea, lo que explica la segunda parte de la queja de su compilador.

Su compilador probablemente tiene una opción para obligarlo a leer líneas más largas.


La duración de su estado de cuenta es demasiado larga. El ancho máximo predeterminado de una línea es 132 .

El compilador truncará las líneas de entrada en ese ancho [como lo hizo, y lo dijo con la advertencia]. Después de eso, tenía una línea incompleta (p. Ej., call foo(a,b que faltaba el cierre ) ) que generó el segundo mensaje de advertencia.

La mejor solución es romper la línea larga con un carácter de continuation , a saber & :

call Coor_Trans(BEXC1(i,1,1),BEYC1(i,1,1),BEZC1(i,1,1), & BEXC1(j,1,1),BEYC1(j,1,1),BEZC1(j,1,1), & ANGLE1(j,1,1),LOC_1,LOC_2,LOC_3)

La mayoría de las guías de estilo C recomiendan mantener líneas en <= 80 caracteres. OMI, esa es una buena práctica incluso con fortran.

Tenga en cuenta que con GNU fortran, puede aumentar el límite con la -ffree-line-length-<n> comando -ffree-line-length-<n> . Entonces, podrías probar -ffree-line-length-512 , pero yo haría la continuación anterior

Nota histórica: 132 columnas eran el ancho máximo que podía imprimir una impresora de línea de alta velocidad, impulsada por cadena, alimentación de rueda dentada, papel plegado en abanico.