Δεν έχουμε by reference στο διερμηνευτή, λέγεται copy in copy out. Δηλαδή αντιγραφή εισόδου(in) στη τοπική, και στο τέλος αντιγραφή εξόδου (out)
Στον διερμηνευτή του Άλκη δίνει 496. Αυτό συμβαίνει γιατί περνάει τις μεταβλητές με ανάποδη φορά. Έτσι τα X, Y, Z είναι το Α, και η τελευταία τιμή στο Α πάει με το Χ, άρα το Α γίνεται 496 (η φορά αντιγραφής είναι η ανάποδη από τη σειρά που μπήκαν οι μεταβλητές).
Στον δικό σου διερμηνευτή. Φτιάχνεις τις Χ, Υ, Ζ και δίνεις τιμές τα Α,Α,Α. Στο τέλος ο διερμηνευτής σου πάει πάλι την λίστα παραμέτρων από την αρχή (εδώ είναι η διαφορά) και κάνει τις εκχωρήσεις, στο Α το Χ, στο Α το Υ, στο Α το Ζ. Άρα εδώ θα πάρει το Α την τιμή του Ζ, το 28
Αν τις έκανε με την ανάποδη φορά, δηλαδή από το Ζ στο Χ, τότε θα είχε τιμή το Α το 496.
Παρόλα αυτά αν δοκιμάσουμε το παρακάτω πρόγραμμα στον διαδικτυακό διερμηνευτή σου, δηλαδή έχουμε πίνακες, τότε θα λειτουργήσει σωστά! Θα δώσει 496. Πώς γίνεται αυτό;
ΠΡΟΓΡΑΜΜΑ ΤΕΣΤ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Α[4]
ΑΡΧΗ
Α[2] <- 0
ΚΑΛΕΣΕ ΠΡΟΒΛΗΜΑ(Α, Α, Α)
ΓΡΑΨΕ Α[2]
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΒΛΗΜΑ(Χ, Υ, Ζ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Χ[4], Υ[4], Ζ[4]
ΑΡΧΗ
Υ[2] <- 6
Ζ[2] <- 28
ΓΡΑΨΕ Υ[2], Ζ[2]
Χ[2] <- 496
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
Στην ουσία εδώ δεν κάνεις αντιγραφή του πίνακα! Δηλαδή στους πίνακες κάνεις μεταφορά δείκτη. Οπότε τα Χ[]. Υ[]. Ζ[] είναι το Α[]. Πάλι κάνεις "αντιγραφή" ως copy out, αλλά γίνεται στο δείκτη, άρα αν υποθέσουμε ότι ο φυσικός δείκτης είναι το 7982734 τότε στο Α δίνει από τα Χ, Υ και Ζ την ίδια τιμή το 7982734.
Να γιατί η επιστροφή είναι 496. Έτυχε γιατί το παράδειγμα του Evry είναι περιορισμένο (biassed), να υποθέτει ότι τρέχει για copy in copy out μέθοδο, και απλά να κοιτάει την σειρά που στο τέλος γίνονται οι αντιγραφές. Αν το τσεκάρει σε διερμηνευτή που παίζει με πραγματική αναφορά (by reference), πχ visual basic 6, τότε θα πάρει το επιθυμητό αποτέλεσμα, για λάθος μέθοδο! Στον προγραμματισμό εύκολα πέφτουμε στο λάθος να "υποθέτουμε" μια λειτουργία (χωρίς να την γνωρίζουμε, ή να την γνωρίζουμε μερικώς), να δίνουμε δεδομένα προς έλεγχο και να παίρνουμε τα "σωστά" και να νομίζουμε πως το τεστ δουλεύει!
Τεστ για τον Ervy, και οποιονδήποτε, να βρει ένα πιο σίγουρο τεστ, ώστε να μην ελέγχει μόνο την φορά, αλλά και την λειτουργία ότι όντως είναι copy in copy out.
ΠΡΟΣΘΗΚΗ 1: Με τη γραμμή ΓΡΑΨΕ Υ[2], Ζ[2] στη διαδικασία φαίνεται άμεσα το by reference (object reference). Δηλαδή στο διερμηνευτή του Άλκη θα πάρουμε 6 και 28, και στον διαδικτυακό τα 28 και 28.
ΠΡΟΣΘΗΚΗ 2: Η typescript, και η κάτω από αυτήν javascript δεν θα περάσουν με αναφορά τίποτα! Θα περάσουν όμως το δείκτη του αντικειμένου! Η επιστροφή δείκτη δεν έχει νόημα! Και αυτό γιατί στην ουσία δεν γίνεται! Ο μόνος τρόπος να πάρεις τον δείκτη πίσω είναι να τον δώσεις ως αποτέλεσμα συνάρτησης, άρα να τον εκχωρήσεις στο επίπεδο της κλήσης, μετά τη κλήση. Ο τρόπος να το ξεπεράσει κανείς αυτό είναι με το Boxing, δηλαδή βάζουμε ένα αντικείμενο άλλο, πχ το W να κρατάει το δείκτη του A, και έτσι η αλλαγή δείκτη στο Α να μπορεί να γίνει! Στην επιστροφή το W (που δεν αλλάζει δείκτη) έχει το νέο Α.
ΠΡΟΣΘΗΚΗ 3: Η C δεν περνάει τίποτα με αναφορά! Πάντα με τιμή. Οπότε όταν θέλουμε να περάσει κάτι σαν να είναι με αναφορά έχει τους δείκτες, που είναι μεταβλητές που κρατάνε το δείκτη προς τη μεταβλητή, και αυτές εν συντομία τους λέμε δείκτες! Σε αντίθεση η C++, έχει πέρασμα με αναφορά, και στις οποίες αναφορές γίνεται μια φορά η "ένωση" με μια μεταβλητή, δεν μπορεί να γίνει δεύτερη φορά. Στη Μ2000 που έχω γράψει ακολουθώ το ίδιο σύστημα, όλα τα περάσματα είναι με τιμή εκτός από εκείνα που δηλώνονται με αναφορά με χρήση του & και ειδικά στη Μ2000 το & πρέπει να εμφανίζεται και στη συνάρτηση ή τη διαδικασία (τμήμα λέγεται στη Μ2000) στην τυπική παράμετρο, πχ Τμήμα Τμήμα1(&Χ) και στη κλήση πχ Τμήμα1 &Α. Και εδώ μόνο μια φορά μπορεί να δοθεί η ένωση, δηλαδή το σε τι θα αναφέρεται το όνομα που λέμε αναφορά. Η υλοποίησή του είναι απλή: όλες οι μεταβλητές είναι σε ένα πίνακα, έτσι πχ αν το Α είναι στη θέση 10, τότε η αναφορά του Α έστω το Χ θα είναι ένα όνομα που θα δείχνει τη θέση 10. Το ζήτημα είναι το πώς θα περάσουμε με τιμή (αφού μόνο με τιμή περνάμε κάτι) στη κλήση την αναφορά! Αυτό γίνεται με την λεγόμενη ισχνή αναφορά, δηλαδή θα περάσουμε κάτι το οποίο κατά την "σύνδεση" θα βρει από αυτό ο διερμηνευτής ότι το Χ θα πρέπει να δείχνει στο 10 και όχι σε μια νέα θέση στο πίνακα μεταβλητών. Ο τρόπος που σκέφθηκα να το κάνω ήταν απλός, να περάσω ένα αλφαριθμητικό με το "απόλυτο όνομα" του A, έτσι αν το Α ανήκει στο τμήμα Αλφα, το απόλυτο όνομα είναι το Αλφα.Α και στην ανάγνωση για την δημιουργία της αναφοράς ο διερμηνευτής "επιλύει" την ισχνή σε πραγματική αναφορά, βρίσκει ότι το Άλφα.Α είναι στην θέση 10, και φτιάχνει την Χ σημειώνοντας ότι είναι αναφορά, και ότι η θέση του είναι στο 10. Η σημείωση ότι είναι αναφορά γίνεται για να μην "μηδενιστεί" η τιμή του 10 κατά την έξοδο, επειδή οι θέσεις "καθαρίζονται" κανονικά στην έξοδο, και αυτό βοηθάει όταν έχουμε κάτι που πρέπει να εκτελεστεί κατά τον καθαρισμό, πχ ένα αντικείμενο.