program main algunas declaraciones real alpha, beta common /coeff/ alpha, beta sentencias stop end subroutine sub1 (algunos argumentos) declaraciones de argumentos real alpha, beta common /coeff/ alpha, beta sentencias return end subroutine sub2 (algunos argumentos) declaraciones de argumentos real alpha, beta common /coeff/ alpha, beta sentencias return endEn el código anterior se ha definido un bloque común con el nombre coeff. El contenido del bloque común son las dos variables alpha y beta. Un bloque común puede contener todas la variables que se deseen, no se necesita que todas sean del mismo tipo. Cada subrutina que quiere usar algunas de las variables del bloque común, tiene que declarar todo el bloque.
Se observa que en este ejemplo se pudo haber evitado fácilmente los bloques comunes, pasando alpha y beta como argumentos. Una buena regla es tratar de evitar los bloques comunes si es posible. Hay pocos casos donde no es posible hacerlo.
common / nombre / lista_de_variablesSe debe tener presente que
subroutine sub3 (algunos argumentos) declaraciones de argumentos real a, b common /coeff/ a, b sentencias return endEsta declaración es equivalente a la de la versión previa donde fue usada alpha y beta. Se recomienda que siempre se use el mismo nombre de la variable que aparece en el bloque común, para evitar confusión. Se muestra un ejemplo de algo que no debe hacerse:
subroutine sub4 (algunos argumentos) declaraciones de argumentos real alpha, beta common /coeff/ beta, alpha sentencias return endAhora alpha es la beta del programa principal y viceversa. Si se ve algo como lo anterior, es probable que se tenga un error de lógica. Tales errores son muy difíciles de encontrar.
program main integer nmax parameter (nmax=20) integer n real A(nmax, nmax) common /matriz/ A, n, nmaxEste bloque común contiene todos los elementos de A, y los enteros n y nmax. Supongamos que se quiere usar la matriz A en algunas subrutinas. Entonces se tiene que incluir la misma declaración en todas las subrutinas, por ejemplo:
subroutine sub1 (...) integer nmax parameter (nmax=20) integer n real A(nmax, nmax) common /matriz/ A, n, nmaxLos arreglos con dimensiones variables no pueden aparecer en bloques comunes, por lo tanto el valor de nmax tiene que ser exactamente el mismo que el del programa principal. Recordar que el tamaño de la matriz tiene que ser conocido en tiempo de compilación, por eso nmax pertenece al bloque común, pero esto sera ilegal.
El ejemplo muestra que no hay ganancia poniendo arreglos en bloques comunes. Por lo que el método preferido en Fortran 77 es pasar arreglos como argumentos a las subrutinas ( junto con las dimensiones principales).
program main real origo(3), x(3) real d, dist common /inutil/ origo read(*,*) origo(1), origo(2), origo(3) 10 continue read(*,*) x(1), x(2), x(3) d = dist(x) write(*,*) 'La distancia es ', d if (x(1) .ge. 0.0) goto 10 stop end real function dist (x) real x(3) real x0, y0, z0 common /inutil/ x0, y0, z0 dist = sqrt((x(1)-x0)**2 + (x(2)-y0)**2 + (x(3)-z0)**2) return end