Linea troncata, Errore di syntax nell’elenco degli argomenti

Quando compilo il programma qui sotto, ho un errore e un avvertimento nella call Coor_Trans comando call Coor_Trans come

Avvertenza: linea troncata

Errore: errore di syntax nell’elenco degli argomenti

Compilo il programma più volte, ma non funziona. Forse c’è qualcosa di sbagliato nel mio comando di chiamata.

 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 

    La durata call conto è troppo lunga. La larghezza massima predefinita di una linea è 132 .

    Il compilatore troncherà le linee di input a quella larghezza [come ha fatto – e lo ha detto con l’avvertimento]. Successivamente, hai avuto una riga incompleta (ad esempio call foo(a,b che mancava la chiusura ) ) che ha generato il secondo messaggio di avviso.

    La soluzione migliore è spezzare la lunga linea con un carattere di continuation , ovvero:

      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 maggior parte delle guide in stile C consiglia di mantenere le linee a <= 80 caratteri. IMO, è una buona pratica anche con Fortran.

    Nota, con GNU fortran, puoi aumentare il limite con l’opzione della riga di comando -ffree-line-length- . Quindi, potresti provare -ffree-line-length-512 , ma, farei la continuazione sopra

    Nota a piè di pagina storica: 132 colonne indicava la larghezza massima che poteva essere stampata su una stampante ad alta velocità, a catena, con pignone, carta a modulo continuo e stampante a linee.

    Lo standard Fortran impone un limite alla lunghezza della linea che i compilatori devono gestire, in questi giorni sono 132 caratteri. Puoi interrompere la linea in un posto adatto e utilizzare una linea di continuazione . Qualcosa come questo:

     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) 

    Notare il & alla fine della linea continua.

    Una volta che la linea viene troncata arbitrariamente, è sintatticamente errata, il che spiega la seconda parte del reclamo del compilatore.

    Il tuo compilatore probabilmente ha un’opzione per forzarlo a leggere le righe più lunghe.