Αποστολέας Θέμα: Θέμα 2  (Αναγνώστηκε 1438 φορές)

Λάμπρος Παπαδόπουλος

  • Βετεράνος
  • ****
  • Μηνύματα: 63
Απ: Θέμα 2
« Απάντηση #30 στις: 17 Ιούν 2019, 11:33:22 μμ »
Παράθεση
Βέβαια είναι πολύ ενδιαφέρον να γνώριζα ΠΩΣ γίνεται το pass by reference στη ΓΛΩΣΣΑ, γιατί δεν το έχω καταλάβει.

Δεν γίνεται... Είναι "με τιμή" στις συναρτήσεις και "με τιμή - αποτέλεσμα" στις διαδικασίες.

bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 367
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Απ: Θέμα 2
« Απάντηση #31 στις: 18 Ιούν 2019, 12:12:30 πμ »
Το "με τιμή-αποτέλεσμα" εδώ λέγεται "copy in copy out". Μια μέθοδος που δεν θα έπρεπε να είχε η ΓΛΩΣΣΑ γιατί δεν χρειάζονταν. Επίσης η ΓΛΩΣΣΑ όταν δεχτεί έκφραση πχ Α+3 ή σταθερά 2 τότε ο διερμηνευτής φτιάχνει μια μεταβλητή και βάζει εκεί το αποτέλεσμα και αυτήν περνάει με αναφορά, έτσι η όποια αλλαγή χάνεται. Στις διαδικασίες λοιπόν αν περάσουμε μεταβλητή, ή στοιχείο πίνακα (δεν έχουν σημασία το πόσες διαστάσεις έχει ο πίνακας, αφού κάθε φορά από τις τιμές δεικτών που δίνουμε επιστρέφει μια μεταβλητή) τότε αυτή θα περαστεί με αναφορά, με το τρόπο copy in copy out. Ο τρόπος αυτός είναι απλός. Ο διερμηνευτής φτιάχνει μια νέα μεταβλητή και αντιγράφει σε αυτή την τιμή της προς αναφορά μεταβλητής, και συνάμα κρατάει τις διευθύνσεις των δυο αυτών μεταβλητών ώστε στην έξοδο από τη διαδικασία να κάνει το ανάποδο, να γράψει από την δεύτερη στη πρώτη, και έτσι να "επικυρώσει" το πέρασμα με αναφορά

Εκτός από την περίπτωση σε μια κλήση να χρησιμοποιήσει κανείς την ίδια μεταβλητή δυο ή περισσότερες φορές (πράγμα απίθανο), ή έναν πίνακα και ένα στοιχείο του ίδιου πίνακα (πράγμα πιθανό), για πέρασμα με αναφορά, όπου θα γίνει "μπάχαλο", (το εξηγεί στη βοήθεια του διερμηνευτή ο Άλκης), μπορούμε να λέμε ότι έχουμε πέρασμα με αναφορά.

Αυτό το copy in copy out υποχρεώνει στην διαδικασία να αναφέρουμε το μέγεθος πίνακα (είναι ο πίνακας όπου θα αντιγραφεί αυτός που βάζουμε με αναφορά, και θα επιστραφεί μετά στον αρχικό). Όταν εκτελείται η διαδικασία δεν υπάρχει κώδικας πίσω που να μπορούμε να πούμε ότι σε αυτόν η τιμή δεν άλλαξε, γιατί δεν πρόκειται να εκτελεστεί αν δεν τελειώσει η διαδικασία. Επειδή δεν υπάρχουν γενικές (ή καθολικές) μεταβλητές και πίνακες, δεν υπάρχει περίπτωση η αλλαγή που δεν γίνεται πίσω να φανεί οπουδήποτε αλλού. Για αυτό το λόγο και αυτή η μέθοδος είναι "απαράδεκτη" για τη ΓΛΩΣΣΑ. Αν βγει, δηλαδή πάμε σε κανονική αναφορά τότε μπορούμε να έχουμε διαδικασίες που να περιέχουν πίνακες όπου δεν θα δηλώνουμε μέγεθος, επειδή θα ορίζονται πριν την διαδικασία και απλά θα περνάνε με αναφορά.

Επειδή το "ζόρι" μάλλον ήταν στο πώς να περάσουμε και μεταβλητή με αναφορά σε μεταβλητή και τιμή σε μεταβλητή, στην ίδια διαδικασία, στην ίδια τυπική παράμετρο, η άλλη λύση μπορεί να είναι: Από την μεριά που καλούμε, το κάθε αποτέλεσμα έκφρασης πάει σε μια "κρυφή" μεταβλητή και αυτή περνάει με αναφορά, και στην επιστροφή δεν γίνεται καμία ενέργεια. Οι κρυφές μεταβλητές μπορούν να υπολογιστούν πριν την εκτέλεση και να σχηματιστούν στην στοίβα επιστροφής ως τοπικές.
« Τελευταία τροποποίηση: 18 Ιούν 2019, 12:18:44 μμ από bugman »

sakisnemkav

  • Βετεράνος
  • ****
  • Μηνύματα: 65
Απ: Θέμα 2
« Απάντηση #32 στις: 19 Ιούν 2019, 01:32:04 μμ »