Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

84
michalisfloyd έγραψε:Και ελπίζωντας να μην φάω βρισήδι, αν μπορείτε να μου εξηγήσετε και την εντολή write, το τι αρχεία ακριβώς ανοίγει, και τι είναι το iostat. thx!
Λοιπόν το write χρησιμεύει για εκτυπώνεις txt κατά τα γνωστά, δεν είμαι σίγουρος να σου πω σε πόσα αλλά μπορείς να δοκιμάσεις ότι αρχείο θες και να checkάρεις αν δουλεύει. Το iostat είναι κάτι σαν βοηθητική μεταβλητή που σου λέει αν όλα πήγαν καλά ανάλογα αν όλα πήγαν καλά κατά το read, αν είναι δηλαδή 0,>0 ή <0. Για να μην σου αναλύω για καθένα τι δείχνει δες εδώ
People who wish to analyze nature without using mathematics must settle for a reduced understanding

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

85
καλησπερα,
θα ηθελα μια βοηθεια στο πρακτικο 4 ασκηση 2(με την εξομαλυνση θορυβου)

στις λυσεις για να κανει το τελικο print χρησιμοποει την εντολη write
αυτο εχει σαν αποτελεσμα να τυπωσει και τα δεδομενα απο το αρχειο smooth_data.txt και την array που εχω δημιουργησει
εγω (Fsmooth(i))??

η εντολη ειναι η εξης:
do i = 1,n
write(2,*) Fsmooth(i)
enddo

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

86
michalisfloyd έγραψε:θα μπορούσε κάποιος να μου εξηγήσει καλά που οφείλουνταν τα run-time errors στις προόδους?
Spoiler: show
Βλέποντας τα θέματα της προόδου:
Όταν έχεις arrays και οι δείκτες αλλάζουν μέσα σε do, ψάχνεις να δεις κυρίως τι γίνεται στα όρια (κάτω όριο-γενικώς μηδέν και άνω όριο-συνήθως N).
  • Τμήμα 1: Όταν το i γίνεται 2*Ν-1, δηλαδή 9, το j=i+1 γίνεται 10 και τελικά ψάχνει το στοιχείο j+1=11 της array. Μιας array όμως που έχει διάσταση 2*Ν=10.
  • Τμήμα 2: Αντιστοίχως, όταν το i παίρνει την τελευταία τιμή, δηλαδή 6, το πρόγραμμα ψάχνει το στοιχείο 11 της array, το οποίο πάλι δεν υπάρχει.
  • Τμήμα 3: Εδώ εξετάζει και τη διαίρεση ακεραίων. Στην πρώτη τιμή του i (δηλαδή 1), το j παίρνει την τιμή της ακέραιας διαίρεσης 1/2, δηλαδή μηδέν*. Δεν υπάρχει το στοιχείο μηδέν, η array έχει γίνει allocated ως y(10) (αφού 2*N=5) και, αφού δεν έχει οριστεί διαφορετικά, ξεκινάει από το στοιχείο με δείκτη 1.
  • Τμήμα 4: Το ίδιο με το τμήμα 3, με τη διαφορά ότι η array έχει γίνει allocated ως y(5) (αφού N=5), οπότε χτυπάει στην print που πάει να εμφανίσει τα στοιχεία 6,7,8,9,10 που δεν υπάρχουν (χτυπάει στο 6 προφανώς).
*Υπενθυμίζω πώς δουλεύει: Πράξεις μεταξύ integer αποθηκεύονται σε ακεραίους (σε κάθε βήμα). Πράξεις μεταξύ real αποθηκεύονται σε κάθε βήμα σε real. Πράξεις μεταξύ real*8 αποθηκεύονται αντιστοίχως σε real*8. Σε πράξεις στις οποίες συμμετέχουν μεταβλητές χαμηλότερης "αξίας", οι μεταβλητές "αναβαθμίζονται" σε μεταβλητές του τύπου με τη μεγαλύτερη αξία που εμφανίζεται στην πράξη πριν χρησιμοποιηθούν. Έτσι, πράξεις μεταξύ integer και real γίνονται τελικά μεταξύ real κτλ.
michalisfloyd έγραψε:αν μπορείτε να μου εξηγήσετε και την εντολή write, το τι αρχεία ακριβώς ανοίγει, και τι είναι το iostat
Spoiler: show
Write: Κάνει την ίδια δουλειά με την print και κάποια επιπλέον πράγματα. Το βασικό της προτέρημα είναι ότι μπορεί να γράψει σε αρχεία (η print όχι). Δες και εδώ.

Αρχεία: γενικώς, χωρίς να το έχω ψάξει, μπορείς να χειρίζεσαι αρχεία ASCII ή τελος πάντων, τουλάχιστον τέτοια. Η κατάληξη στο όνομα αρχείου δεν σε πειράζει. Μπορεί να είναι ".txt", μπορεί να είναι ".csv", μπορεί να μην είναι τίποτα, μπορεί να είναι και ".mike" άμα θες. Απλώς τα Windows καταλαβαίνουν το είδος του αρχείου από την κατάληξή του και το ανοίγουν με ένα συμβατό πρόγραμμα. Αν δεν καταλάβει την κατάληξη, τότε θα σε ρωτήσει με ποιο πρόγραμμα να το ανοίξει.

iostat: προαιρετικό option των εντολών read/write. Η μεταβλητή που έχεις αντιστοιχίσει σε αυτό θα έχει τιμή μηδέν όσο όλα πάνε καλά, -1 όταν βρει το τέλος του αρχείου ή κάποια θετική τιμή που υποδηλώνει κωδικό σφάλματος αν κάτι πάει στραβά. Δες το link του panos108.
papas έγραψε:θα ηθελα μια βοηθεια στο πρακτικο 4 ασκηση 2(με την εξομαλυνση θορυβου)

στις λυσεις για να κανει το τελικο print χρησιμοποει την εντολη write
αυτο εχει σαν αποτελεσμα να τυπωσει και τα δεδομενα απο το αρχειο smooth_data.txt και την array που εχω δημιουργησει
εγω (Fsmooth(i))??
Το αρχείο με unit=2 (smooth_data.txt) υποτίθεται ότι είναι κενό στην αρχή (δεν υπάρχει καν στην πρώτη εκτέλεση του προγράμματος). Οπότε απλώς θα γράψει σε αυτό τα στοιχεία της Fsmooth. Το τι θα γίνει με το αρχείο αν υπάρχει ήδη μπορείς να το καθορίσεις με το option status στην εντολή open. Μπορείς να κάνεις διάφορα με την open, δες π.χ. εδώ. (εκτός ύλης φυσικά :P) Αυτό ρωτάς ή κάτι άλλο; Μπερδεύτηκα... :S

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

87
σαφέστατος, να 'σαι καλά. στην άσκηση γ του πρακτικού 5 κάνω αυτό:

Κώδικας: Επιλογή όλων

program mixalis
implicit none
real, allocatable, dimension (:) :: A
REAl, allocatable , dimension (:) :: B
REAL, ALLOCATABLE, DIMENSION (:) :: C
integer n,m, i, d
print*, 'Give the  dimension for array A:'
read*, n
allocate (a(n))
print*, 'Give the dimension for array B:'
read*, m 
allocate (b(m))

print *, 'Type in the array A elements.'
do i =1,n
read*, a(i)
enddo

print*, 'Type in the array B elements.'

do i=1,m
read*, b(i)
enddo

call tomi(n,m,a,b,d)
allocate (c(d))
PRINT*, C

end

subroutine tomi (n,m,a,b,d)
implicit none
integer i,j
INTEGER, intent(in):: n,m
real, intent (in), dimension(n) ::a
real, intent (in), dimension (m) :: b
integer, intent (out) ::d
real, intent (out), dimension (d):: c


d=0

do i=1,n
do j=1,m

if (a(i)==b(j)) then
d=d+1
c(d)=a(i)
endif
enddo
enddo

end subroutine
και φυσικά μου λέει compilation failed. :P έχω δει τις λύσεις, την κατάλαβα, απλά δεν καταλαβαίνω το πρόβλημα με τον δικό μου τρόπο λύσης -.-
επιπλέον στις λύσης, η διάσταση της τομής υπολογίζεται έξω απο το subroutine, ενώ η οδηγία λέει να είναι έξοδος από την subroutine. κι αυτό επιδίωξα.
Τελευταία επεξεργασία από το μέλος MakisH την Τρί 29 Ιαν 2013, 6:22 pm, έχει επεξεργασθεί 1 φορά συνολικά.
Λόγος: προσθήκη code bbcode για να μην ξεχειλώνει η σελίδα

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

88
Δεν μου αρέσει αυτό το σημείο:

Κώδικας: Επιλογή όλων

call tomi(n,m,a,b,d)
allocate (c(d))
Δηλαδή:
1. Υπολογίζεις εσωτερικά στην υπορουτίνα την τομή σε έναν πίνακα C διάστασης d, όπου το d δεν έχει πάρει τιμή πριν χρησιμοποιηθεί.
2. Η array C δεν περνιέται ως όρισμα, άρα χάνεται αφού τελειώσει η υπορουτίνα. Μάλιστα, της έχεις βάλει intent(out) χωρίς να την έχεις στα ορίσματα (εκεί χτυπάει αρχικά)
3. Αφού τελειώσει η υπορουτίνα κάνεις allocate την array C

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

89
MakisH έγραψε:Το αρχείο με unit=2 (smooth_data.txt) υποτίθεται ότι είναι κενό στην αρχή (δεν υπάρχει καν στην πρώτη εκτέλεση του προγράμματος). Οπότε απλώς θα γράψει σε αυτό τα στοιχεία της Fsmooth. Το τι θα γίνει με το αρχείο αν υπάρχει ήδη μπορείς να το καθορίσεις με το option status στην εντολή open. Μπορείς να κάνεις διάφορα με την open, δες π.χ. εδώ. (εκτός ύλης φυσικά :P) Αυτό ρωτάς ή κάτι άλλο; Μπερδεύτηκα... :S

αρα αφου δεν υπαρχει το αρχειο με unit=2 γτ το κανω open?

η ερωτηση μου ουσιαστικα ειναι, οταν κανω to write αν θα τυπωθει και το αρχειο(εστω οτι υπαρχει) και ο πινακας που δημιουργησα

Re: Προγραμματισμός & χρήση Η/Υ (2012-13)

90
Η εντολή open δεν σημαίνει απαραίτητα να ανοίξεις ένα υπάρχον αρχείο. Αν δεν υπάρχει το αρχείο, το φτιάχνει. Η εντολή αυτή το συνδέει με το πρόγραμμά σου βασικά. Αν θες να χρησιμοποιήσεις κάποιο αρχείο, είτε για να διαβάσεις, είτε για να γράψεις, πρέπει να το περάσεις πρώτα από μια εντολή open, που θα του δώσει και έναν αριθμό στο unit (τι θα γράψεις στη write στη θέση του "2" αν δεν έχεις δώσει "αριθμό-ταυτότητα" στο αρχείο; ).

Δεν καταλαβαίνω τι ακριβώς ρωτάς. Η εντολή αυτή (write) θα γράψει (τυπώσει αν θες) τα στοιχεία του πίνακα στο αρχείο με unit=2.
Δεν γράφει το αρχείο με unit=2 (τα περιεχόμενα του αρχείου). Γράφει στο αρχείο με unit=2.