Δημοσιεύτηκε: 09 Σεπ 2009, 13:09
από Dimitris
Kαλημέρα,

στη fortran αλλά και σε όλες τις γλώσσες γενικότερα οι μεταβλητές βρίσκονται στη μνήμη όταν και η αντίστοιχη συνάρτηση εκτελειται. Το scope, όπως λέγεται, των μεταβλητών περιορίζεται από τις συναρτήσεις. Εκτός κι αν είναι ολικές (global) οι μεταβλητές. Στην περίπτωσή σου τα L, r στο κυρίως πρόγραμμα είναι διαφορετικά απο τα L, r στην initial. (Συμβουλή πάντα να χρησιμοποιείς implicit none στα προγραμματα και τις συναρτήσεις, θα γλιτώσεις πολλά προβλήματα.)

Τώρα το πρόβλημα είναι αρκετα γενικό όπως το θέτεις και δε ξέρω τι γνώσεις έχεις και τι θες να κάνεις. Μία πρόχειρη λύση είναι να χρησιμοποιήσεις common blocks (οπότε θα είναι global οι μεταβλητές), άλλη να επιστρέψεις τα L, r ως οutput arguments (οπότε θα έχεις μόνο τοπικές μεταβλητές), τρίτη να χρησιμοποιήσεις modules. Αλλά θα σου πρότεινα να πάρεις ένα βιβλίο fortran ή να διαβάσεις στο internet.

Κώδικας: Επιλογή όλων
program main
implicit none
integer :: L, r
call initial(L,r)
print*, L, r
end
subroutine initial(L,r)
implicit none
integer:: L, r
L=4
r=7
end


Άλλη λύση
Κώδικας: Επιλογή όλων
program main
implicit none
integer::L, r
common /cname/ L, r
call initial
print L, r
end

subroutine initial
implicit none
integer:: L, r
common /cname/ L, r
L=4
r=7
end