arrays - programas - En Fortran 90, ¿las dimensiones de la matriz deben declararse de antemano?
producto vectorial fortran (1)
Desea utilizar matrices asignables:
PROGRAM mytest
IMPLICIT NONE
INTEGER :: i, j, k, mysum
REAL, DIMENSION(:,:), allocatable :: c !<- c is allocatable, rank 2
! Let array c be a k-by-k**2 array
! Determine k within the program by some means...for example,
mysum=0
DO i=1, 3
mysum=mysum+1
END DO
k=mysum
WRITE(*,*) "k=", k
WRITE(*,*) "k**2=", k**2
WRITE(*,*)
allocate(c(k,k**2)) ! <-- allocate array c with supplied shape
DO i=1,size(c,1)
WRITE(*,"(100(3X,F3.1))") (c(i,j), j=1,size(c,2))
END DO
deallocate(c) ! <-- deallocate when done
END PROGRAM mytest
¿Es necesario declarar las dimensiones de la matriz antes que cualquier otro código? Por ejemplo, he escrito el siguiente código de ejemplo simplificado:
PROGRAM mytest
IMPLICIT NONE
INTEGER :: i, j, k, mysum
! Let array c be a k-by-k**2 array
! Determine k within the program by some means...for example,
mysum=0
DO i=1, 3
mysum=mysum+1
END DO
k=mysum
REAL, DIMENSION(k, k**2) :: c
WRITE(*,*) "k=", k
WRITE(*,*) "k**2=", k**2
WRITE(*,*)
DO i=1,size(c,1)
WRITE(*,"(100(3X,F3.1))") (c(i,j), j=1,size(c,2))
END DO
END PROGRAM mytest
El punto que trato de hacer es que me gustaría crear una matriz c
que es k
by- k**2
en tamaño, y k
solo está determinada por otros cálculos dentro del código; k
no se conoce desde el principio.
Pero, el código anterior me da el siguiente mensaje de error en tiempo de compilación:
mytest.f90:13.31:
REAL, DIMENSION(k, k**2) :: c
1
Error: Unexpected data declaration statement at (1)
donde la línea 13 en mi código es la línea donde finalmente declaro c
: REAL, DIMENSION(k, k**2) :: c
.
Por otro lado, si declaro k
y especifico sus dimensiones por adelantado,
PROGRAM mytest
IMPLICIT NONE
INTEGER :: i, j, k, mysum
REAL, DIMENSION(3,9) :: c
! Let array c be a k-by-k**2 array
! Determine k within the program by some means...for example,
mysum=0
DO i=1, 3
mysum=mysum+1
END DO
k=mysum
WRITE(*,*) "k=", k
WRITE(*,*) "k**2=", k**2
WRITE(*,*)
DO i=1,size(c,1)
WRITE(*,"(100(3X,F3.1))") (c(i,j), j=1,size(c,2))
END DO
END PROGRAM mytest
Obtengo el resultado correcto:
k= 3
k**2= 9
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Pero, como no sé k
antemano, no puedo hacer exactamente esto en mi código actual. ¿Hay alguna manera de "declarar" la matriz c
inicialmente, sin especificar sus dimensiones, y luego especificar las dimensiones una vez que se conoce el valor de k
?