Προς το περιεχόμενο

θεμα με την fortran


mi3s

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω μια άσκηση να κάνω και ο κώδικας που έχω γράψει είναι

>open(unit=1,file='dedomena.txt')
open(unit=2,file='apotelesmata.txt')
read(1,3)n
dimension a(n),b(n)
3 format(1f2.0)
4 format(10f2.1)
read(1,4)(a(n),i=1,n)
read(1,4)(b(n),i=1,n)
do i=1,n-1
a(n)=a(n)+b(n+1)
end do
write(2,5)(a(n),i=1,n)
5 format('pinakas a',/,2f5.3)
6 format('pinakas b',/,3f8.5)
write(2,6)(b(n),i=1,n)
close(1)
close(2)
end

Παρόλα αυτά ενώ και τα λυμένα πραδείγματα είναι με αυτόν τον τρόπο λυμένα αυτό μου εμφανίζει μήνυμα ότι το dimension το έχω γράψει στο κυρίως πρόγραμμα και αυτό είναι λάθος.Τι ακριβώς κάνω λάθος?Σε ένα άλλο πρόγραμμα πάλι τα ίδια.

>--------------------Configuration: program2 - Win32 Debug--------------------
Compiling Fortran...
C:\Program Files\Microsoft Visual Studio\MyProjects\program2\program2.f90
C:\Program Files\Microsoft Visual Studio\MyProjects\program2\program2.f90(5) : Error: A specification statement cannot appear in the executable section.
dimension a(n),b(n)
^
C:\Program Files\Microsoft Visual Studio\MyProjects\program2\program2.f90(8) : Error: Constants and expressions are invalid in read-only I/O lists.   [A]
read(1,4)(a(n),i=1,n)
----------^
C:\Program Files\Microsoft Visual Studio\MyProjects\program2\program2.f90(9) : Error: Constants and expressions are invalid in read-only I/O lists.   [b]
read(1,4)(b(n),i=1,n)
----------^
C:\Program Files\Microsoft Visual Studio\MyProjects\program2\program2.f90(11) : Error: This name has already been used as an external function name.   [A]
a(n)=a(n)+b(n+1)
^
C:\Program Files\Microsoft Visual Studio\MyProjects\program2\program2.f90(11) : Error: This function, which is specified as the left side of an assignment statement, is invalid.   [A]
a(n)=a(n)+b(n+1)
^
Error executing df.exe.

program2.exe - 5 error(s), 0 warning(s)

 

Thanks in advance.

Δημοσ.

Αν και έχει περάσει αρκετός καιρός από τα χρόνια της Fortran, θα προσπαθήσω να σε βοηθήσω.

 

Πρώτα μερικοί κανόνες:

1. Πρώτα δηλώνουμε μεταβλητές και μετά γράφουμε τον κώδικα που θα εκτελεστεί με αυτές στη Fortran. Εσύ δηλώνεις μετα τις open(...) δύο πίνακες. Αυτό δεν παίζει στη Fortran.

2. Καλό επίσης είναι το πρόγραμμα να έχει εμφανή αρχή και τέλος. Στο δικό σου ούτε αρχή φαίνεται ούτε τέλος.

 

Οπότε: (υποθέτωντας F90)

 

>Program insomnia_question

Implicit None

Stop
End Program insomnia_question

 

είναι το βασικό κομάτι. Εκεί τώρα θέλεις να ορίσεις δύο πίνακες ίδιου μεγέθους (n) το οποίο θα το διαβάσεις από ένα αρχείο (dedomena.txt). Οπότε, ορίζουμε τις μεταβλητές του προγράμματος.

 

>Program insomnia_question

Implicit None

Integer :: n
Real , Allocatable :: a(, b(

Stop
End Program insomnia_question

 

Τους a, b τους ορίζεις ως Allocatable γιατί δεν ξέρεις από πριν το μέγεθός τους. Διαβάζουμε τώρα το 'n' από το αρχείο σου ('dedomena.txt') και φτιάχνουμε και τους πίνακες:

 

 

>Program insomnia_question

Implicit None

Integer :: n
Real , Allocatable :: a(, b(

! read n from file
n = 0
open(unit = 1, file='dedomena.txt', [u]action = 'read'[/u])
read(1, 3) n
3 format (I2)

! allocate and initialize a,b
allocate(a(n))
allocate(b(n))
a = 0
b = 0

! data reading
...
! data output
...

! clean up
deallocate(a)
deallocate(
close(1)
Stop
End Program insomnia_question

 

Διαβάζουμε δηλαδή το n ώς ακέραιο (και όχι ως float όπως το είχες) και στη συνέχεια κανουμε τα memory allocations. Κανονικά πρέπει να τσεκάρουμε και τι διαβάσαμε αλλά τέλος πάντων, το αφήνουμε ως άσκηση... Στη συνεχεια μηδενίζουμε τους πίνακες για να μην περιέχουν ότι να ναι. Το input/output το αφήνω. Αν θες βοήθεια πες.

Δημοσ.

Ευχαριστώ,αν και πρώτη φορά το βλέπω αυτό για τους πίανεκς αλλά θα δω πρώτα πως το κανανε και οι υπόλοιποι.

 

---------- Προσθήκη στις 17:13 ---------- Προηγούμενο μήνυμα στις 16:14 ----------

 

Τελικά έδινε στην εκφώνηση ότι ο μέγιστος αριθμός των στοιχείων είναι 20.

>dimension a(20),b(20)
open(unit=1,file='dedomena1.txt')
open(unit=2,file='apotelesmata.txt')
read(1,*)n
read(1,7)(a(n),i=1,n)
read(1,7)(b(n),i=1,n)

do i=1,n-1
a(n)=a(n)+b(n+1)

end do
write(2,3)
write(2,5) (a(n),i=1,n)
7 format(10f2.1)
3 format('pinakas a',/)
4 format('pinakas b',/)
5 format (f8.3,f8.3)
6 format(f8.5,f8.5,f8.5)
write(2,4)
write(2,6)(b(n),i=1,n)
close(1)
close(2)

Stop
end

Λειτουργεί καλά αλλά δεν ξέρω γιατί στα αποτελέσματα βγάζει σε όλα τα στοιχεία του πίνακα α το τελευταίο στοιχείο του α και σε όλο το β το τελευταίο του β.

Τι μπορεί να έχει λάθος.Το συγκεκριμέν ολάθος προφανώς και είναι λογικό,αλλά δεν το βρίσκω.Θέλει η άσκηση να βγάζει τα στοιχεία με την μορφή α1=α1+β2....αν-1=αν-1+βν αν =βν.

Δημοσ.
Ευχαριστώ,αν και πρώτη φορά το βλέπω αυτό για τους πίανεκς αλλά θα δω πρώτα πως το κανανε και οι υπόλοιποι.

 

---------- Προσθήκη στις 17:13 ---------- Προηγούμενο μήνυμα στις 16:14 ----------

 

Τελικά έδινε στην εκφώνηση ότι ο μέγιστος αριθμός των στοιχείων είναι 20.

>dimension a(20),b(20)
open(unit=1,file='dedomena1.txt')
open(unit=2,file='apotelesmata.txt')
read(1,*)n
read(1,7)(a(n),i=1,n)
read(1,7)(b(n),i=1,n)

do i=1,n-1
a(n)=a(n)+b(n+1)

end do
write(2,3)
write(2,5) (a(n),i=1,n)
7 format(10f2.1)
3 format('pinakas a',/)
4 format('pinakas b',/)
5 format (f8.3,f8.3)
6 format(f8.5,f8.5,f8.5)
write(2,4)
write(2,6)(b(n),i=1,n)
close(1)
close(2)

Stop
end

Λειτουργεί καλά αλλά δεν ξέρω γιατί στα αποτελέσματα βγάζει σε όλα τα στοιχεία του πίνακα α το τελευταίο στοιχείο του α και σε όλο το β το τελευταίο του β.

Τι μπορεί να έχει λάθος.Το συγκεκριμέν ολάθος προφανώς και είναι λογικό,αλλά δεν το βρίσκω.Θέλει η άσκηση να βγάζει τα στοιχεία με την μορφή α1=α1+β2....αν-1=αν-1+βν αν =βν.

 

Τσέκαρε τις διάφορες γραμμές που γράφεις

 

>
a(n), i = 1, n
b(n), i = 1, n

 

Μαλλον πρέπει να τις αλλάξεις σε

 

>
a(i), i = 1, n
b(i), i = 1, n

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...