Next              Up                Back               Contents

Επόμενο:4.6 Διτονική ταξινόμηση με συγχώνευση Πάνω:Κεφάλαιο 4o : Επικοινωνία διεργασιών Πίσω: 4.4 Επίλυση Γραμμικών Εξισώσεων


 

4.5 Κανάλια και δομημένοι τύποι

 

Σε αυτό το κεφάλαιο, αναφέρθηκαν ορισμένα από τα πιο περίπλοκα θέματα της χρήσης των καναλιών στη Multi-Pascal. Μέχρι τώρα, η αναφορά εστιάζεται σε μεταβλητές καναλιών που ο τύπος δεδομένων είναι ένας από τους 4 απλούς τύπους δεδομένων της Pascal: INTEGER, REAL, CHAR, BOOLEAN. Η Multi-Pascal δίνει τη δυνατότητα ο τύπος δεδομένων ενός καναλιού να είναι οποιοσδήποτε έγκυρος τύπος της κοινής Pascal ακόμα και πίνακες, εγγραφές και δείκτες. Παρακάτω, δίδονται παραδείγματα δηλώσεων καναλιών όπου ο τύπος συστατικού είναι τύπου πίνακα και εγγραφής (τύπου ARRAY και RECORD):

 

C: CHANNEL OF ARRAY[1..10] OF REAL;

D: CHANNEL OF RECORD

        left,right:INTEGER;

        center:REAL;

        END;

Επίσης, στη Multi-Pascal επιτρέπεται ο τύπος συστατικού να είναι δείκτης (pointer), όπως φαίνεται και παρακάτω:

TYPE

    item: RECORD

            x,y:INTEGER;

            END;

VAR

    E: CHANNEL OF ^item;

Όλοι οι κανόνες που αναφέρθηκαν παραπάνω για τη χρήση των καναλιών, ισχύουν και για τα κανάλια πινάκων, εγγραφών και δεικτών. Για να γραφτεί μια νέα τιμή στο κανάλι, χρησιμοποιούμε το όνομα του καναλιού στο αριστερό τμήμα μιας εντολής ανάθεσης και μια έκφραση στο δεξιό τμήμα που πρέπει να είναι του ίδιου τύπου με τον τύπο συστατικού του καναλιού. Για παράδειγμα, το παρακάτω τμήμα προγράμματος γράφει μια νέα τιμή σε ένα κανάλι πινάκων:

 

TYPE artyp=ARRAY[1..10] OF REAL;

VAR

    C:CHANNEL OF artyp;

    a:artyp;

...

BEGIN (* Κυρίως πρόγραμμα *)

    ...

    C:=a;

Στην παραπάνω ανάθεση, τα τρέχοντα περιεχόμενα του πίνακα a γράφονται στο τέλος του καναλιού C. Κάθε στοιχείο του καναλιού C είναι ένας πίνακας με 10 πραγματικές τιμές. Προσέξτε ότι ο τύπος της μεταβλητής a ταιριάζει με τον τύπο συστατικού της μεταβλητής καναλιού C. Παρόμοια, το κανάλι μπορεί να διαβασθεί, χρησιμοποιώντας την παρακάτω πρόταση:

 

a:=C;

Ωστόσο δεν επιτρέπεται η χρήση του δείκτη σε ένα κανάλι πινάκων δηλαδή η έκφραση C[3] δεν είναι συντακτικά έγκυρη. Για να προσπελαθεί το τρίτο στοιχείο του πίνακα, πρέπει πρώτα να γραφτεί ολόκληρος ο πίνακας που βρίσκεται στην αρχή του καναλιού σε ένα απλό πίνακα όπως είναι ο a και μετά να χρησιμοποιηθεί η έκφραση a[3]. Οι μόνες λειτουργίες που μπορούν εκτελεσθούν μέσα σε ένα κανάλι πινάκων, είναι η ανάγνωση και η εγγραφή ενός ολόκληρου πίνακα από το κανάλι. Δεν επιτρέπεται δηλαδή να διαβασθεί ή να γραφτεί ένα μεμονωμένο στοιχείο του πίνακα που βρίσκεται στο κανάλι. Οι κανόνες είναι ίδιοι και για τα κανάλια εγγραφών όπως φαίνεται και στο παρακάτω παράδειγμα:

 

TYPE rectyp=RECORD

                left,right:INTEGER;

                center:REAL;

                END;

VAR D:CHANNEL OF rectyp;

    e:rectyp;

...

BEGIN

    ...

    D:=e;

Μια ολόκληρη εγγραφή μπορεί να διαβασθεί ή να γραφτεί από ένα κανάλι εγγραφών, χρησιμοποιώντας το όνομα του καναλιού σε ένα από τα δύο τμήματα μιας πρότασης ανάθεσης και μια απλή μεταβλητή με τον ίδιο τύπο εγγραφής στο άλλο τμήμα. Όπως και με τους πίνακες, δεν επιτρέπεται η απευθείας προσπέλαση σε κάποιο συγκεκριμένο πεδίο του καναλιού εγγραφών. Για παράδειγμα, η έκφραση D.left θα επιστρέψει συντακτικό λάθος. Μια μεμονωμένη λειτουργία μπορεί να διαβάσει ή να γράψει μόνο μια ολόκληρη εγγραφή. Παρακάτω παρατίθεται ο γενικός κανόνας που ισχύει για τις μεταβλητές καναλιών:

 

Ο τύπος δεδομένων ενός καναλιού μπορεί να είναι οποιοσδήποτε έγκυρος τύπος της Pascal.

Όπως φαίνεται και στα παραδείγματα διασωλήνωσης που υπάρχουν στο κεφάλαιο, η Multi-Pascal επιτρέπει και τη χρήση πινάκων που να περιέχουν κανάλια. Τα προγράμματα διασωλήνωσης χρησιμοποιούν ένα μονοδιάστατο πίνακα καναλιών αλλά επιτρέπονται και πολυδιάστατοι πίνακες καναλιών όπως φαίνεται παράδειγμα δήλωσης:

A:ARRAY [1..10,1..20] OF CHANNEL OF REAL;

Η μεταβλητή A που εμφανίζεται παραπάνω, είναι ένας διδιάστατος πίνακας καναλιών δηλαδή κάθε στοιχείο του πίνακα είναι ξεχωριστό κανάλι με πραγματικούς αριθμούς. Ο πίνακας A διαθέτει 200 ανεξάρτητα κανάλια όπου το κάθε κανάλι μπορεί να προσπελαθεί με τη χρήση δεικτών όπως ακριβώς συμβαίνει και με τους απλούς πίνακες. Η ανάγνωση και η εγγραφή κάθε καναλιού πραγματοποιείται όπως συνήθως, χρησιμοποιώντας το κανάλι στο αριστερό ή δεξιό τμήμα μιας πρότασης ανάθεσης. Στις ακόλουθες προτάσεις αναθέσεων διαβάζεται μια τιμή από το κανάλι A[3,2] και μετά γράφεται πίσω στο κανάλι A[3,2] (η μεταβλητή p είναι μια απλή πραγματική μεταβλητή):

 

p:= A[3,2];  (* Διαβάζει το κανάλι A[3,2] *)

A[4,3]:=p; (* Γράφει στο κανάλι A[3,2] *)

Πρόσθετα παραδείγματα όπου συνδυάζονται μεταβλητές καναλιών με άλλους τύπους δεδομένων της Pascal, μπορούν να βρεθούν στο παράρτημα όπως εγγραφές που περιέχουν κανάλια ως στοιχεία και δείκτες σε κανάλια. Επίσης, στο παράρτημα γίνεται αναφορά στο πέρασμα καναλιών ως παραμέτρων σε διαδικασίες και στη χρήση καναλιών μέσα σε εκφράσεις.


     Next              Up                Back               Contents

Επόμενο:4.6 Διτονική ταξινόμηση με συγχώνευση Πάνω:Κεφάλαιο 4o : Επικοινωνία διεργασιών Πίσω: 4.4 Επίλυση Γραμμικών Εξισώσεων