Τι θα εμφανίσει;

Ξεκίνησε από ChrisD, 22 Μαΐου 2025, 04:47:32 ΜΜ

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

ChrisD

Καλησπέρα σας όλους και ευχαριστώ εκ των προτέρων για το χρόνο σας και για τα φώτα σας!
Χωρίς να εξετάζω την σκοπιμότητα υλοποίησης του παραπάνω προγράμματος, αν καλούσα την διαδικασία και έβαζα στις μεταβλητές που καλώ το Α δύο φορές και μέσα στην διαδικασία στην πρώτη φορά που το έτρεχα άλλαζα την πρώτη μεταβλητή, δηλαδή το Χ και σας δεύτερη περίπτωση αλλάζω την δεύτερη μεταβλητή το Ζ τι θα περίμενα να εμφανιστεί στο πρόγραμμα;   
Σκέφτηκα ότι λογικά την δεύτερη τιμή πάντα αλλά τρέχοντας τον διερμηνευτή διαπίστωσα ότι αυτό δεν ισχύει...
Με την εντολή Χ <- Χ + 1 θα εμφανίσει 2,2,2
Με την εντολή Ζ <- Ζ + 1 θα εμφανίσει 1,1,2
Άρα καταλαβαίνω ότι αυτό που επηρεάζει είναι η πρώτη μεταβλητή. Γιατί;  
 

ΠΡΟΓΡΑΜΜΑ ΑΣΚ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α, Υ
ΑΡΧΗ
  Α <- 1
  ΚΑΛΕΣΕ ΔΙΑΔ(Α, Α, Υ) 
  ΓΡΑΨΕ Α, Α, Υ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ ΔΙΑΔ(Χ, Ζ, Ω) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ, Ζ, Ω
ΑΡΧΗ
  Ω <- Χ + Ζ
  Ζ <- Ζ + 1
  ! Χ <- Χ + 1
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

petrosp13

Προφανώς είναι θέμα υλοποίησης του διερμηνευτή και πώς αντιγράφει πίσω τις τιμές
Αλλά γιατί να μπλέξεις με κάτι τέτοιο;
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

alkisg

Χρήστο δες τη βοήθεια του Διερμηνευτή, περιγράφει και το πως και το γιατί:

https://alkisg.mysch.gr/ΓΛΩΣΣΑ/Μεταβίβαση_παραμέτρων/

Marfoto2

Κύριε Άλκη καλησπέρα. 
Διάβασα τη βοήθεια του Διερμηνευτή στο link που παραθέσατε.
Θέλω να κάνω την εξής ερώτηση.
Κλείνει το άρθρο με την ακόλουθη σημείωση:
  • Οι δύο παραπάνω διαφορές του μηχανισμού copy in - copy out από αυτόν με αναφορά δεν ήταν ιδιαίτερα «σημαντικές» επειδή το αποτέλεσμα προγράμματος ήταν το ίδιο και στις δύο περιπτώσεις. Υπάρχει όμως μία περίπτωση που οι δύο μηχανισμοί επιφέρουν διαφορετικά αποτελέσματα. Αν έχουμε μία διαδικασία που αυξάνει κατά ένα την τιμή δύο παραμέτρων (α <- α + 1, β <- β + 1 ) και την καλέσουμε με την ίδια μεταβλητή (ΚΑΛΕΣΕ Αύξηση(α, α)) τότε στο μηχανισμό με αναφορά το α θα αυξηθεί κατά δύο ενώ στο μηχανισμό με αντιγραφή κατά 1! Αυτό γίνεται επειδή δημιουργούνται δύο αντίγραφα του α, αυξάνονται και τα δύο κατά ένα και τελικά επιστρέφουν την καινούργια τιμή τους στο αρχικό α. Καλύτερα να αποφεύγεται η κατασκευή ασκήσεων που χρησιμοποιούν αυτήν τη δυσνόητη συμπεριφορά.

Αν αντί για  β <- β + 1  είχαμε  β <- β + 2, με το μηχανισμό copy in - copy out ποια θα ήταν η τιμή του α; Θα ήταν αυξημένη κατά ένα ή κατά δύο; Δλδ ποια είναι η σειρά του μηχανισμού αντιγραφής με την εκτέλεση της εντολής ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ; Με τη σειρά που είναι γραμμένες οι τυπικές παράμετροι ή από την τελευταία προς την πρώτη;
Ευχαριστώ εκ των προτέρων.

alkisg

Στον Διερμηνευτή, η ώθηση των παραμέτρων γίνεται από αριστερά προς τα δεξιά, και η απώθηση/εξαγωγή αντίθετα, από δεξιά προς τα αριστερά. Οπότε το παρακάτω πρόγραμμα θα εμφανίσει 1:

Κώδικας: glossa
ΠΡΟΓΡΑΜΜΑ ΜεταβίβασηΠαραμέτρων
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: α
ΑΡΧΗ
  α <- 0
  ΚΑΛΕΣΕ Αύξηση(α, α) 
  ΓΡΑΨΕ α
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ Αύξηση(α, β) 
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: α, β
ΑΡΧΗ
  α <- α + 1
  β <- β + 2
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

Marfoto2

Παράθεση από: alkisg στις 19 Φεβ 2026, 08:14:15 ΠΜΣτον Διερμηνευτή, η ώθηση των παραμέτρων γίνεται από αριστερά προς τα δεξιά, και η απώθηση/εξαγωγή αντίθετα, από δεξιά προς τα αριστερά. Οπότε το παρακάτω πρόγραμμα θα εμφανίσει 1:
Ευχαριστώ πολύ. Λειτουργία στοίβας λοιπόν και όχι ουράς.
Μια ερώτηση ακόμα.
Σε όλες τις γλώσσες (που ακολουθούν το μηχανισμό copy in - copy out) συμβαίνει αυτό ή σε άλλες έχουμε λειτουργία ουράς;

alkisg

Γενικά δεν υπάρχουν και πολλές με μηχανισμό copy in / out, επειδή είναι πολύ ΜΗ αποδοτικός.
Δες λίγο τα links που δίνω σε αυτό το παλιότερο θέμα:

https://alkisg.mysch.gr/steki/index.php?topic=8141.msg88995#msg88995

Η Ada από το 2013 θεωρεί σφάλμα μεταγλώττισης να περάσεις την ίδια παράμετρο δυο φορές, όταν είναι copy out.

Δες και μια παλιότερη συζήτηση του 2006:

https://alkisg.mysch.gr/steki/index.php?topic=289.0