Επιστροφή από Διαδικασία

Ξεκίνησε από kapapi, 05 Απρ 2015, 04:40:08 ΜΜ

« προηγούμενο - επόμενο »

kapapi

Δίνεται το παρακάτω πρόγραμμα (κύριο πρόγραμμα και υποπρόγραμμα):

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: ;


kapapi

Δε βλέπω ζύμωση.
Είναι και οι ημέρες τέτοιες, Κυριακή του Λαζάρου βλέπετε.

itt

Δεδομένου ότι οι αριθ1, αριθ2 αντιγράφονται στις Α,Β όταν επιστρέφει η συνάρτηση, η αλλαγή θα γίνει στην γραμμή 7.

kapapi

1. Το υποπρόγραμμα τώρα είναι διαδικασία,
άρα η γραμμή 7 μεταβιβάζει τιμές προς την διαδικασία, δηλαδή λόγω της 7 η παράμετρος αριθ1 θα πάρει την τιμή της Α, δηλαδή 1
και επίσης λόγω της 7, η παράμετρος αριθ2 θα πάρει την τιμή της Β, δηλαδή 2.

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

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

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

itt

Παράθεση από: kapapi στις 05 Απρ 2015, 11:11:32 ΜΜ
1. Το υποπρόγραμμα τώρα είναι διαδικασία,
άρα η γραμμή 7 μεταβιβάζει τιμές προς την διαδικασία, δηλαδή λόγω της 7 η παράμετρος αριθ1 θα πάρει την τιμή της Α, δηλαδή 1
και επίσης λόγω της 7, η παράμετρος αριθ2 θα πάρει την τιμή της Β, δηλαδή 2.

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

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

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


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

kapapi

Σύμφωνα με το νέο σχολικό βιβλίο (αντιγράφω σελίδα 181):

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

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

itt

Παράθεση από: kapapi στις 06 Απρ 2015, 08:36:16 ΠΜ
Σύμφωνα με το νέο σχολικό βιβλίο (αντιγράφω σελίδα 181):

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

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

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

kapapi

Μετά και από αυτή την εξήγηση θα έπρεπε να γίνει διόρθωση στο βιβλίο ή αυτό που γράφει, ταιριάζει απόλυτα με την εξήγηση που δόθηκε;

itt

Παράθεση από: kapapi στις 06 Απρ 2015, 05:52:18 ΜΜ
Μετά και από αυτή την εξήγηση θα έπρεπε να γίνει διόρθωση στο βιβλίο ή αυτό που γράφει, ταιριάζει απόλυτα με την εξήγηση που δόθηκε;

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