|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 17
|
[Fortran]Subroutine che usa array creati nel main program
Salve a tutti.
Ho bisogno di un suggerimento riguardo una cosa semplice in Fortran. Ho creato una subroutine che deve elaborare degli array creati nel main. Come funziona la chiamata e la definizione delle variabili? Grazie per qualsiasi suggerimento |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Codice:
subroutine funzione(a1, a2, out) parameter n1 = 100 parameter n2 = 100 double a1(n1) double a2(n2) double out // conti, dove generi un valore di out in base ai valori contenuti in a1 e a2 return end program MyProgram parameter n1 = 100 parameter n2 = 100 double array1(n1) double array2(n2) double output // assegno dei valori ad array1, array2 call funzione(array1, array2, output) write(*,*) output end Dopo il primo statement con un'espressione (tipo array1 = array2) non puoi più dichiarare niente. Una subroutine non ritorna niente (è equivalente a void funzione() in C/C++), infatti necessita di un "return" prima di "end", quindi il risultato dei conti lo salvi dentro ad out. Questo perchè nel FORTRAN tutte le variabili vengono sempre passate per pointer. Una function invece ha un valore di ritorno. Una subroutine non richiede che la/le variabile/i di output sia per forza l'ultima (o le ultime) nella lista di parametri, potevo anche scrivere Codice:
subroutine funzione(a2, out, a1) Ovviamente nel main e nella subroutine la dichiarazione dei vettori deve concordare. Poichè passi gli array per pointer, la subroutine non può sapere la loro dimensione (FORTRAN è molto arcaico in questo). Quindi deve conoscere la loro dimensione (usando parameter, come nel primo esempio), o gliela devi passare come parametro: Codice:
subroutine funzione(a1, n1, a2, n2, out) integer n1 double a1(n1) integer n2 double a2(n2) double out // conti, dove generi un valore di out in base ai valori contenuti in a1 e a2 return end Ultima modifica di vendettaaaaa : 18-02-2012 alle 11:41. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
"double precision", non "double" e basta.
|
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 17
|
Quindi mi basterebbe fare una cosa del tipo
Codice:
subroutine writebintable(coun,emin,emax,N)
parameter (N=1024)
integer N
integer k,coun(N)
real*4 emin(N),emax(N)
...
Codice:
program main
integer N
real*4 emin(1024),emax(1024),Delta
parameter (N=1024)
...
call writebintable(coun(k),emin(k),emax(k),1024)
...
ad esempio se dopo la dichiarazione PARAMETER metto o non metto il valore della variabile fra parentesi ottengo diversi errori... |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
Cmq nella funzione non puoi passare un parameter come argomento. Prova così: Codice:
subroutine writebintable(coun,emin,emax)
integer N
parameter (N=1024)
integer k,coun(N)
real*4 emin(N),emax(N)
...
return
end
Codice:
program main
integer N
parameter (N=1024)
real*4 emin(N),emax(N),Delta
...
! call writebintable(coun(k),emin(k),emax(k),N) <-- no, devi passare solo il nome dell'array, senza parentesi
call writebintable(coun,emin,emax) <-- ok
...
end
|
|
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 17
|
Le sto provando tutte!
La libreria interna restituisce il seguente errore: numerical overflow during implicit datatype conversion |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Mi manderesti il programma completo, se possibile, via pm? Provo a farlo girare sul mio pc e vediamo, m'hai incuriosito!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:34.




















