Αποστολέας Θέμα: Επιστροφή από Διαδικασία  (Αναγνώστηκε 1340 φορές)

kapapi

  • Οπαδός
  • **
  • Μηνύματα: 15
Επιστροφή από Διαδικασία
« στις: 05 Απρ 2015, 04:40:08 μμ »
Δίνεται το παρακάτω πρόγραμμα (κύριο πρόγραμμα και υποπρόγραμμα):

1. ΠΡΟΓΡΑΜΜΑ ΠΡΟΓ
2. ΜΕΤΑΒΛΗΤΕΣ
3. ΑΚΕΡΑΙΕΣ: Α, Β
4. ΑΡΧΗ
5.     Α <- 1
6.     Β <- 2
7.     ΚΑΛΕΣΕ ΔΙΑΔ ( Α, Β )
8.     ΓΡΑΨΕ Α, Β
9. ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
10. !
11. ΔΙΑΔΙΚΑΣΙΑ ΔΙΑΔ (αριθ1, αριθ2)
12. ΜΕΤΑΒΛΗΤΕΣ
13. ΑΚΕΡΑΙΕΣ: αριθ1, αριθ2
14. ΑΡΧΗ
15.     αριθ1 <- 10
16.     αριθ2 <- 20
17. ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

Ερώτηση_1: Οι τιμές που θα εμφανιστούν στην εντολή 8 - ΓΡΑΨΕ Α, Β - με ποιά εντολή θα τις έχουν πάρει ;
Απάντηση_1: Με την εντολή 17 -ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

Ερώτηση_2: Η εντολή 17 είναι δηλωτική ή εκτελεστέα;
Απάντηση_2: ;

Ερώτηση_3: Μπορούν δηλωτικές εντολές να προκαλούν αλλαγή τιμών (ή γενικά μεταβολές) σε μεταβλητές;
Απάντηση_3: ;

« Τελευταία τροποποίηση: 05 Απρ 2015, 05:02:52 μμ από kapapi »

kapapi

  • Οπαδός
  • **
  • Μηνύματα: 15
Απ: Επιστροφή από Διαδικασία
« Απάντηση #1 στις: 05 Απρ 2015, 09:01:04 μμ »
Δε βλέπω ζύμωση.
Είναι και οι ημέρες τέτοιες, Κυριακή του Λαζάρου βλέπετε.

itt

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 428
  • Real stupidity beats ΑΙ any time
Απ: Επιστροφή από Διαδικασία
« Απάντηση #2 στις: 05 Απρ 2015, 10:53:18 μμ »
Δεδομένου ότι οι αριθ1, αριθ2 αντιγράφονται στις Α,Β όταν επιστρέφει η συνάρτηση, η αλλαγή θα γίνει στην γραμμή 7.

kapapi

  • Οπαδός
  • **
  • Μηνύματα: 15
Απ: Επιστροφή από Διαδικασία
« Απάντηση #3 στις: 05 Απρ 2015, 11:11:32 μμ »
1. Το υποπρόγραμμα τώρα είναι διαδικασία,
άρα η γραμμή 7 μεταβιβάζει τιμές προς την διαδικασία, δηλαδή λόγω της 7 η παράμετρος αριθ1 θα πάρει την τιμή της Α, δηλαδή 1
και επίσης λόγω της 7, η παράμετρος αριθ2 θα πάρει την τιμή της Β, δηλαδή 2.

2. Η επιστροφή τιμών από την διαδικασία θα γίνει όταν αυτή τελειώσει, δηλαδή λόγω της εντολής 17, η παράμετρος αριθ1 θα επιστρέψει την τιμή της στην Α, δηλαδή 10
και επίσης λόγω της 17, η παράμετρος αριθ2 θα επιστρέψει την τιμή της στην Β, δηλαδή 20.

3. Η επιστροφή από τη διαδικασία δεν θα γίνει στην εντολή 7 αλλά στην επόμενη εντολή δηλαδή στην 8.

ΕΔΩ νομίζω έχουμε και τη βασική διαφορά Διαδικασίας - Συνάρτησης: στη συνάρτηση επιστρέφουμε στην ίδια εντολή για να ολοκληρώσουμε ότι αφήσαμε, ενώ στη διαδικασία επιστρέφουμε στην επόμενη, αφού δεν υπάρχει εκκρεμότητα, διότι η επιστροφή τιμών γίνεται λόγω της:
17. ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

itt

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 428
  • Real stupidity beats ΑΙ any time
Απ: Επιστροφή από Διαδικασία
« Απάντηση #4 στις: 05 Απρ 2015, 11:28:17 μμ »
1. Το υποπρόγραμμα τώρα είναι διαδικασία,
άρα η γραμμή 7 μεταβιβάζει τιμές προς την διαδικασία, δηλαδή λόγω της 7 η παράμετρος αριθ1 θα πάρει την τιμή της Α, δηλαδή 1
και επίσης λόγω της 7, η παράμετρος αριθ2 θα πάρει την τιμή της Β, δηλαδή 2.

2. Η επιστροφή τιμών από την διαδικασία θα γίνει όταν αυτή τελειώσει, δηλαδή λόγω της εντολής 17, η παράμετρος αριθ1 θα επιστρέψει την τιμή της στην Α, δηλαδή 10
και επίσης λόγω της 17, η παράμετρος αριθ2 θα επιστρέψει την τιμή της στην Β, δηλαδή 20.

3. Η επιστροφή από τη διαδικασία δεν θα γίνει στην εντολή 7 αλλά στην επόμενη εντολή δηλαδή στην 8.

ΕΔΩ νομίζω έχουμε και τη βασική διαφορά Διαδικασίας - Συνάρτησης: στη συνάρτηση επιστρέφουμε στην ίδια εντολή για να ολοκληρώσουμε ότι αφήσαμε, ενώ στη διαδικασία επιστρέφουμε στην επόμενη, αφού δεν υπάρχει εκκρεμότητα, διότι η επιστροφή τιμών γίνεται λόγω της:
17. ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ


Η "εντολή" 17 (δεν ξέρω κατα πόσον θεωρείται εντόλη), τo μόνο που κάνει είναι να μεταφέρει την εκτέλεση στο σημείο που ειναι στην κορυφή του stack. Η εκ νέου ανάθεση θα γίνει μετά από αυτό προφανώς και έξω από τη συνάρτηση, οπότε  η αλλαγή των μεταβλητών θα γίνει εκεί που σου πα.

kapapi

  • Οπαδός
  • **
  • Μηνύματα: 15
Απ: Επιστροφή από Διαδικασία
« Απάντηση #5 στις: 06 Απρ 2015, 08:36:16 πμ »
Σύμφωνα με το νέο σχολικό βιβλίο (αντιγράφω σελίδα 181):

Μετά την εκτέλεση των εντολών της διαδικασίας, όταν εκτελεστεί η εντολή ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ, οι μεταβλητές της διαδικασίας που αναφέρονται στη δήλωση της διαδικασίας δίνουν τις τιμές που περιέχουν στις αντίστοιχες μεταβλητές που περιλαμβάνονται στην κλήση της διαδικασίας ...

Το πρακτικό ερώτημα είναι: εξαιτίας ποιάς εντολής (1 ... 17) οι παράμετροι Α, Β αποκτούν τις νέες τους τιμές;

itt

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 428
  • Real stupidity beats ΑΙ any time
Απ: Επιστροφή από Διαδικασία
« Απάντηση #6 στις: 06 Απρ 2015, 03:30:35 μμ »
Σύμφωνα με το νέο σχολικό βιβλίο (αντιγράφω σελίδα 181):

Μετά την εκτέλεση των εντολών της διαδικασίας, όταν εκτελεστεί η εντολή ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ, οι μεταβλητές της διαδικασίας που αναφέρονται στη δήλωση της διαδικασίας δίνουν τις τιμές που περιέχουν στις αντίστοιχες μεταβλητές που περιλαμβάνονται στην κλήση της διαδικασίας ...

Το πρακτικό ερώτημα είναι: εξαιτίας ποιάς εντολής (1 ... 17) οι παράμετροι Α, Β αποκτούν τις νέες τους τιμές;

Θα προσπαθήσω να το εξηγήσω πιο αναλυτικά. Λαμβάνοντας υπόψην ό,τι υπάρχει στο βιβλίο, δεν περνάς  σε μια διαδιακασία τη θέση μνήμης της μεταβλητής, αλλά ένα αντίγραφο της τιμής της. Για να μπορέσεις να μεταβάλεις λοιπόν το περιεχόμενο της θέση μνήμης της μεταβλητής, θα πρέπει να το κάνεις έξω από την συνάρτηση όταν θα έχεις επιστρέψει. Ένας τρόπος να το κάνεις ειναι να χρησιμοποιήσεις τις θέσεις που έχεις κάνει reserve στο stack για τα locals πριν καλέσεις την διαδακασία ως holders των νέων τιμών, και πριν κάνεις increment τον stack pointer (αφού έχεις επιστρέψει δηλαδή),  να αντιγράψεις τις τιμές από το stack στις θέσεις μνήμης των μεταβλητών. Aυτό εκ των πραγμάτων, δεν μπορεί να γίνει στη 17.

kapapi

  • Οπαδός
  • **
  • Μηνύματα: 15
Απ: Επιστροφή από Διαδικασία
« Απάντηση #7 στις: 06 Απρ 2015, 05:52:18 μμ »
Μετά και από αυτή την εξήγηση θα έπρεπε να γίνει διόρθωση στο βιβλίο ή αυτό που γράφει, ταιριάζει απόλυτα με την εξήγηση που δόθηκε;

itt

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 428
  • Real stupidity beats ΑΙ any time
Απ: Επιστροφή από Διαδικασία
« Απάντηση #8 στις: 06 Απρ 2015, 10:16:55 μμ »
Μετά και από αυτή την εξήγηση θα έπρεπε να γίνει διόρθωση στο βιβλίο ή αυτό που γράφει, ταιριάζει απόλυτα με την εξήγηση που δόθηκε;

Αυτό που λέω είναι ότι αφού δεν μπορείς να περάσεις τη θέση μνήμης της μεταβλητής στη Διαδιακασία, εγώ δεν μπορώ να φανταστώ αυτή τη στιγμή πώς θα μπορούσες να το υλοποιήσεις χωρίς να επιστρέψεις το control στο προηγούμενο stack frame.