vectorial programas producto multiplicacion memoria matrices guia ejemplos dinamica allocate arrays fortran dimensions

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 ?