Πώς να επιστρέψετε πολλές τιμές από μια λειτουργία Delphi

click fraud protection

Μια συνηθέστερη κατασκευή σε ένα Δελφοί η εφαρμογή θα είναι α διαδικασία ή μια λειτουργία. Γνωστά ως ρουτίνες, διαδικασίες ή λειτουργίες είναι μπλοκ δήλωσης που καλείτε από διαφορετικές θέσεις ενός προγράμματος.

Απλά βάλτε μια διαδικασία είναι μια ρουτίνα που δεν επιστρέφει μια τιμή, ενώ μια συνάρτηση επιστρέφει μια τιμή.

Μια τιμή επιστροφής από μια συνάρτηση ορίζεται από τον τύπο επιστροφής. Στις περισσότερες περιπτώσεις θα γράψετε μια λειτουργία επιστρέφει μία μόνο τιμή που θα ήταν ένας ακέραιος, string, boolean ή άλλος απλός τύπος, επίσης τύποι επιστροφής θα μπορούσαν να είναι ένας πίνακας, μια λίστα συμβολοσειρών, μια παρουσία ενός προσαρμοσμένου αντικειμένου ή παρόμοια.

Σημειώστε ότι ακόμα και αν η συνάρτηση επιστρέφει μια λίστα συμβολοσειρών (μια συλλογή από χορδές) εξακολουθεί να επιστρέφει μια μόνο τιμή: μια εμφάνιση της λίστας συμβολοσειρών.

Επιπλέον, οι ρουτίνες των Δελφών μπορούν πραγματικά να έχουν πολλά πρόσωπα: Ρουτίνα, Μέθοδος, Μέθοδος Δείκτης, Αναπληρωτής Συμβάντος, Ανώνυμη μέθοδος ...

instagram viewer

Μπορεί μια λειτουργία να επιστρέψει πολλές τιμές;

Η πρώτη απάντηση που έρχεται στο μυαλό δεν είναι, απλώς και μόνο επειδή όταν σκεφτόμαστε μια συνάρτηση, σκεφτόμαστε μια ενιαία αξία επιστροφής.

Βεβαίως, η απάντηση στην παραπάνω ερώτηση είναι, εντούτοις, ναι. Μια συνάρτηση μπορεί να επιστρέψει πολλές τιμές. Ας δούμε πώς.

Παράμετροι Var

Πόσες τιμές μπορεί να επιστρέψει η ακόλουθη λειτουργία, μία ή δύο;

λειτουργία ΘετικήΑπορροφητική (const τιμήIn: ακέραιο; var valueOut: πραγματική): boolean;

Η συνάρτηση προφανώς επιστρέφει μια τιμή boolean (true ή false). Τι γίνεται με τη δεύτερη παράμετρο "valueOut" που δηλώνεται ως παράμετρος "VAR" (μεταβλητή);

Παράμετροι Var μεταβιβάζονται στη λειτουργία με παραπομπή που σημαίνει ότι αν η συνάρτηση αλλάξει την τιμή της παραμέτρου-μια μεταβλητή στο τελεστή δέσμευσης κώδικα - η συνάρτηση θα αλλάξει την τιμή της μεταβλητής που χρησιμοποιείται για την παράμετρο.

Για να δείτε πώς τα παραπάνω λειτουργούν, εδώ είναι η υλοποίηση:

λειτουργία ΘετικήΑπορροφητική (const τιμήIn: ακέραιο; var valueOut: πραγματική): boolean;

ξεκινήσει

 αποτέλεσμα: = valueIn> 0;

αν αποτέλεσμα έπειτα valueOut: = 1 / valueIn;

τέλος;

Η τιμή "valueIn" διαβιβάζεται ως μια σταθερή συνάρτηση παραμέτρων δεν μπορεί να την αλλάξει και αντιμετωπίζεται ως μόνο για ανάγνωση.

Εάν η τιμή "valueIn" ή μεγαλύτερη από μηδέν, στην παράμετρο "valueOut" αποδίδεται η αμοιβαία τιμή "valueIn" και το αποτέλεσμα της λειτουργίας είναι αληθές. Αν valueIn είναι <= 0, τότε η συνάρτηση επιστρέφει ψευδές και το "valueOut" δεν μεταβάλλεται με κανέναν τρόπο.

Εδώ είναι η χρήση:

var

 b: boolean;

 r: πραγματική;

ξεκινήσει

 r: = 5;

 β: = θετική αμοιβαία (1, r);

 //here:

 // b = true (από το 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 b: = θετική αμοιβαία (-1, r);

 //here:

 // b = false (από -1 

τέλος;

Επομένως, το PositiveReciprocal μπορεί στην πραγματικότητα να "επιστρέψει" 2 τιμές! Χρησιμοποιώντας παραμέτρους var μπορείτε να έχετε μια επιστροφή ρουτίνας περισσότερες από μία τιμές.

Out Παράμετροι

Υπάρχει ένας άλλος τρόπος για να καθορίσετε μια παράμετρο παραπομπής-χρησιμοποιώντας τη λέξη-κλειδί "out", όπως στο:

λειτουργία PositiveReciprocalOut (const τιμήIn: ακέραιο; έξω valueOut: πραγματική): boolean;

ξεκινήσει

 αποτέλεσμα: = valueIn> 0;

αν αποτέλεσμα έπειτα valueOut: = 1 / valueIn;

τέλος;

Η εφαρμογή του PositiveReciprocalOut είναι ίδια με αυτή του PositiveReciprocal, υπάρχει μόνο μία διαφορά: το "valueOut" είναι μια παράμετρος OUT.

Με τις παραμέτρους που δηλώνονται ως "out", απορρίπτεται η αρχική τιμή της αναφερόμενης μεταβλητής "valueOut".

Εδώ είναι η χρήση και τα αποτελέσματα:

var

 b: boolean;

 r: πραγματική;

ξεκινήσει

 r: = 5;

 b: = ΘετικήΑπορροφητικήΚάτω (1, r);

 //here:

 // b = true (από το 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 β: = ΘετικήΑπορροφητικήΚαύδα (-1, r);

 //here:

 // b = false (από -1 

τέλος;

Σημειώστε πως στη δεύτερη κλήση η τιμή της τοπικής μεταβλητής "r" έχει οριστεί σε "0". Η τιμή του "r" ορίστηκε στο 5 πριν από την κλήση λειτουργίας, αλλά δεδομένου ότι η παράμετρος που δηλώθηκε ως "out", όταν "r" έφτασε στη λειτουργία η τιμή απορρίφθηκε και η προεπιλεγμένη τιμή "κενό" είχε οριστεί για την παράμετρο (0 για πραγματική τύπος).

Ως αποτέλεσμα, μπορείτε να στείλετε με ασφάλεια τις μη αρχικές μεταβλητές για παραμέτρους έξω - κάτι που δεν πρέπει να κάνετε με τις παραμέτρους "var". Οι παράμετροι χρησιμοποιούνται για να στείλουν κάτι στη ρουτίνα, εκτός από εδώ με παραμέτρους "out" :) και συνεπώς οι μη αρχικές μεταβλητές (που χρησιμοποιούνται για τις παραμέτρους VAR) θα μπορούσαν να έχουν περίεργες τιμές.

Επιστροφή αρχείων;

Οι παραπάνω εφαρμογές όπου μια συνάρτηση θα επέστρεφαν περισσότερες από μία τιμές δεν είναι ωραίες. Η λειτουργία επιστρέφει στην πραγματικότητα μία μόνο τιμή, αλλά επίσης επιστρέφει, καλύτερα να μεταβάλει, τις τιμές των παραμέτρων var / out.

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

Σκέψου τα ακόλουθα:

τύπος

 TLatitudeLongitude = Ρεκόρ

 Γεωγραφικό πλάτος: πραγματικό.

 Γεωγραφικό μήκος: πραγματικό.

τέλος;

και μια υποθετική λειτουργία:

λειτουργία Πού είμαι(const Όνομα πόλης: σειρά): TLatitudeLongitude;

Η λειτουργία WhereAmI θα επέστρεφε το Γεωγραφικό πλάτος και μήκος για μια δεδομένη πόλη (πόλη, περιοχή, ...).

Η υλοποίηση θα είναι:

λειτουργία Πού είμαι(const Όνομα πόλης: σειρά): TLatitudeLongitude;

ξεκινήσει// χρησιμοποιήστε κάποια υπηρεσία για να εντοπίσετε το "townName", και στη συνέχεια να αντιστοιχίσετε το αποτέλεσμα λειτουργίας:

 αποτέλεσμα. Latitude: = 45.54;

 αποτέλεσμα. Γεωγραφικό μήκος: = 18.71;

τέλος;

Και εδώ έχουμε μια λειτουργία που επιστρέφει 2 πραγματικές τιμές. Εντάξει, επιστρέφει 1 εγγραφή, αλλά αυτό το αρχείο έχει 2 πεδία. Σημειώστε ότι μπορείτε να έχετε μια πολύπλοκη εγγραφή ανάμειξης διαφόρων τύπων που πρέπει να επιστραφούν ως αποτέλεσμα μιας λειτουργίας.

Αυτό είναι. Επομένως, ναι, οι λειτουργίες των Delphi μπορούν να επιστρέψουν πολλές τιμές.

instagram story viewer