[OT] Re: duda con Fortran

José Pablo Fonfría jpablo.fonfria en gmail.com
Jue Ago 21 01:51:49 BST 2008


Hola Héctor,

> Hola a todos!
> Tengo un problemita con el leguaje Fortran, espero que alguien de las 
> tantas personas que leen los mensajes de la lista de correo pueda 
> ayudarme (espero que en la lista se pueda hacer la pregunta).
> 
> Resulta que estoy haciendo un programa que lee una matriz a partir de un 
> archivo .dat, el problema es que necesito que el programa obtenga el 
> tamaño de la matriz sin necesidad de ingresar el tamaño de esta y que 
> tampoco se encuentre en el archivo donde está la matriz.
> 
> Me pregunto si en Fortran se pueden usar los caracteres de fin de linea 
> para esto (si es posible), si no... no se que hacer por favor ayudenme.
> 
> Gracias.
> 

Es un proceso bastante manual pero sencillo. Al menos el que utilizo yo 
aunque seguro que hay otros más interesantes. Supón que abres el archivo 
donde tienes la matriz escrita. Haces un bucle para la lectura y la 
cortas cuando el programa encuentra el EOF. Sería algo así:

! Inicializamos la matriz A utilizando un valor fácilmente reconocible
! y que sepas que no va a aparecer en tus matrices.

do i=1,1000
   do j=1,1000
     A(i,j)=-100
   enddo
enddo

! Abrimos el archivo de datos.

open(10,file='datos.dat',status='old')

! Inicializamos un contador

n=0

! Hacemos un bucle haciendo variar los índices entre
! 1 y un valor alto.
! Al leer los números usamos la opción "end" para dirigir
! al programa a la línea que nos interese cuando haya llegado
! al EOF.
! En cuanto al formato de lectura, a mi me gusta usarlo. Queda todo
! muy ordenado y me parece más adecuado para manejar datos.
! Además, este proceso no funciona sin formato.

do i=1,1000
   read(10,20,end=15)(A(i,j),j=1,1000)
   n=n+1
enddo
15 close(10)
20 format(1000(i2,1x))     !ejemplo de formato para este caso

De esta forma podrías leer la matriz completa sin conocer sus 
dimensiones. El número de filas es igual a n, puesto que cuando el 
programa llega al EOF sale del bucle y el número n es el número de filas 
leídas. Para hallar el número de columnas basta con utilizar el número 
al cual has inicializado la matriz A.

m=0
do j=1,1000
   if(A(1,j).eq.-100)goto 30
   m=m+1
enddo
30 continue

En fortran 90/95 se puede hacer de forma más sencilla. También échale un 
vistazo a la lectura directa de archivos. Es posible que te sirva.

El libro siguiente siempre me ha ayudado mucho:

http://www.star.le.ac.uk/~cgp/prof77.html

Un libro básico de fortran 90 lo puedes encontrar aquí:

http://mat21.etsii.upm.es/ayudainf/aprendainf/Fortran90/Fortran90.pdf

Por supuesto, también puedes utilizar (te lo aconsejo) el manual de tu 
compilador para conocer las mejores opciones dependiendo de lo que 
quieras hacer. Y sigue buscando en la red, que hay mucha información.

Espero que esto te sirva. Si te hace falta más ayuda, vuelve a escribir 
pero esta vez añade un [OT] en el asunto. De ese modo te evitarás 
respuestas como la de David (o al menos las minimizarás). Yo creo que es 
muy probable que siempre encuentres aquí a alguien que te ayude en este 
tipo de cosas.

Un saludo.

Pablo.



Más información sobre la lista de distribución ubuntu-es