mi3s Δημοσ. 6 Ιανουαρίου 2010 Δημοσ. 6 Ιανουαρίου 2010 Έχω μια άσκηση να κάνω και ο κώδικας που έχω γράψει είναι >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.
jstark Δημοσ. 6 Ιανουαρίου 2010 Δημοσ. 6 Ιανουαρίου 2010 Αν και έχει περάσει αρκετός καιρός από τα χρόνια της 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 το αφήνω. Αν θες βοήθεια πες.
mi3s Δημοσ. 8 Ιανουαρίου 2010 Μέλος Δημοσ. 8 Ιανουαρίου 2010 Ευχαριστώ,αν και πρώτη φορά το βλέπω αυτό για τους πίανεκς αλλά θα δω πρώτα πως το κανανε και οι υπόλοιποι. ---------- Προσθήκη στις 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+βν αν =βν.
jstark Δημοσ. 8 Ιανουαρίου 2010 Δημοσ. 8 Ιανουαρίου 2010 Ευχαριστώ,αν και πρώτη φορά το βλέπω αυτό για τους πίανεκς αλλά θα δω πρώτα πως το κανανε και οι υπόλοιποι. ---------- Προσθήκη στις 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
mi3s Δημοσ. 8 Ιανουαρίου 2010 Μέλος Δημοσ. 8 Ιανουαρίου 2010 Ok ευχαριστώ πολύ.Έγινε τελικά.Βλακωδέστατο λάθος.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.