gd020188
22-01-2009, 22:03
Buona sera a tutti. Sto lavorando in Fortran 90 (per l'università) e sto cercando di scrivere un programma che utilizzi una subroutine per il calcolo del prodotto tra una matrice a m righe e n colonne per un vettore a n righe.
Il problema è che il compilatore non mi da errori ma poi quando mando in esecuzione il programma mi fornisce dei risulatati che non mi tornano.
Se invece scrivo il programma per intero senza subroutine, il risultato restituito è corretto.
Il programma senza subroutine è questo:
program matrice_vettore
real::a(100,100),b(100),c(100)
integer::m,n,i,j
print*,"Inserire il numero delle righe e delle colonne della matrice"
read*,m,n
print*,"Inserire gli elementi della matrice"
do i=1,m
do j=1,n
read*,a(i,j)
enddo
enddo
print*,"Inserire gli elementi del vettore"
do i=1,n
read*,b(i)
enddo
do i=1,m
c(i)=0
do j=1,n
c(i)=c(i)+a(i,j)*b(j)
enddo
enddo
print*,"Il vettore risultato è"
do i=1,m
print*,c(i)
enddo
end
e funziona.
Con la subroutine invece mi viene così:
program matrice_vettore
real::a(100,100),b(100),c(100)
integer::m,n,i,j
print*,"Inserire il numero delle righe e delle colonne della matrice"
read*,m,n
print*,"Inserire gli elementi della matrice"
do i=1,m
do j=1,n
read*,a(i,j)
enddo
enddo
print*,"Inserire gli elementi del vettore"
do i=1,n
read*,b(i)
enddo
call mat_vet(m,n,a,b,c)
print*,"Il vettore risultato è"
do i=1,m
print*,c(i)
enddo
end
subroutine mat_vet(m,n,a,b,c)
real::a(m,n),b(n),c(m)
integer::m,n,i,j
do i=1,m
c(i)=0
do j=1,n
c(i)=c(i)+a(i,j)*b(j)
enddo
enddo
end
e non funzione: se per esempio uso la matrice a 2 righe e 3 colonne con 1,2,3 come prima riga e 4,5,6 come seconda riga e poi l vettore a 3 righe con 1,2,3 in prima, seconda e terza riga rispettivamente, anziché darmi 14,32 come risultato mi da 1,4.
Qualcuno saprebbe dirmi dove sbaglio nella subroutine?
Il problema è che il compilatore non mi da errori ma poi quando mando in esecuzione il programma mi fornisce dei risulatati che non mi tornano.
Se invece scrivo il programma per intero senza subroutine, il risultato restituito è corretto.
Il programma senza subroutine è questo:
program matrice_vettore
real::a(100,100),b(100),c(100)
integer::m,n,i,j
print*,"Inserire il numero delle righe e delle colonne della matrice"
read*,m,n
print*,"Inserire gli elementi della matrice"
do i=1,m
do j=1,n
read*,a(i,j)
enddo
enddo
print*,"Inserire gli elementi del vettore"
do i=1,n
read*,b(i)
enddo
do i=1,m
c(i)=0
do j=1,n
c(i)=c(i)+a(i,j)*b(j)
enddo
enddo
print*,"Il vettore risultato è"
do i=1,m
print*,c(i)
enddo
end
e funziona.
Con la subroutine invece mi viene così:
program matrice_vettore
real::a(100,100),b(100),c(100)
integer::m,n,i,j
print*,"Inserire il numero delle righe e delle colonne della matrice"
read*,m,n
print*,"Inserire gli elementi della matrice"
do i=1,m
do j=1,n
read*,a(i,j)
enddo
enddo
print*,"Inserire gli elementi del vettore"
do i=1,n
read*,b(i)
enddo
call mat_vet(m,n,a,b,c)
print*,"Il vettore risultato è"
do i=1,m
print*,c(i)
enddo
end
subroutine mat_vet(m,n,a,b,c)
real::a(m,n),b(n),c(m)
integer::m,n,i,j
do i=1,m
c(i)=0
do j=1,n
c(i)=c(i)+a(i,j)*b(j)
enddo
enddo
end
e non funzione: se per esempio uso la matrice a 2 righe e 3 colonne con 1,2,3 come prima riga e 4,5,6 come seconda riga e poi l vettore a 3 righe con 1,2,3 in prima, seconda e terza riga rispettivamente, anziché darmi 14,32 come risultato mi da 1,4.
Qualcuno saprebbe dirmi dove sbaglio nella subroutine?