Next             Up               Back              Contents

Επόμενο:A.3 ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΟΥ ΔΕΝ ΥΠΟΣΤΗΡΙΖΟΝΤΑΙ Πάνω: Παράρτημα Α Πίσω: A.1. ΠΕΡΙΒΑΛΛΟΝΤΑ


 

Α.2. ΜΕΤΑΒΛΗΤΕΣ ΚΑΝΑΛΙΩΝ

 

Α.2.1. Μεταβλητές καναλιών σε εκφράσεις

 

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

 

VAR c: CHANNEL OF INTEGER;
          x, r: INTEGER;

...
BEGIN
  ...
  x := c * 2 + r;

 

Για την εκτέλεση αυτής της εκχώρησης πρέπει πρώτα να διαβαστεί η επόμενη τιμή από το κανάλι c, να πολλαπλασιαστεί επί 2 και στο αποτέλεσμα να προστεθεί με την τιμή της μεταβλητής r. Η τιμή που προκύπτει εκχωρείται στη μεταβλητή x. Γενικά σε μια έκφραση μια μεταβλητή καναλιού μπορεί να βρίσκεται οπουδήποτε θα μπορούσε να βρίσκεται μια απλή μεταβλητή του αυτού τύπου.

Κάθε αναφορά σε μιά μεταβλητή καναλιού που βρίσκεται σε μιά έκφραση ή στο δεξί μέρος μιας εκχώρησης αντιστοιχεί στην ανάγνωση μιας τιμλης από το αντίστοιχο κανάλι. Αν το κανάλι είναι άδειο τότε η έκφραση δεν μπορεί να υπολογιστεί ούτε η εκχώρηση να εκτελεστεί και η αντίστοιχη διεργασία αναστέλει την εκτέλεσή της μέχρι να εγγραφεί κάποια τιμή στο κανάλι. Έτσι η διεργασία ανάγνωσης πάντα αναστέλλεται όταν προσεγγίζει ένα άδειο κανάλι. Αντίθετα η διεργασία εγγραφής ποτέ δεν αναστέλλεται γιατί ο απομονωτής του καναλιού θεωρείται απεριόριστης χωρητικότητας.

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

 

VAR
  
c: CHANNEL OF INTEGER;


  d: CHANNEL OF REAL;


   i: INTEGER


  x, y: REAL;


  a: ARRAY [1..20] OF REAL;


BEGIN


  ...


  IF 2*x > d/2 THEN x := y;

  a[c+i] := 34.5;

	Προσοχή όμως στη διαφορά των παρακάτω δύο εκχώρησεων


x := 3*d;

x := d + d + d;

 

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

Μια ακόμη διαφορά μεταξύ των απλών μεταβλητών και των μεταβλητών καναλιών είναι οτι οι τελευταίες δεν μπορούν να χρησιμοποιηθούν σε εντολές Read και Write.

 

Α.2.2. Οι μεταβλητές καναλιών ως παράμετροι.

 

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

 

VAR d: CHANNEL OF REAL;


  PROCEDURE Compute (r: REAL);


    ...


BEGIN


  ...
  
Compute(2*d);

 

Όταν θα κληθεί η διαδικασία Compute η τιμή της παραμέτρου r υπολογίζεται ως εξής: πρώτα εκτελείται μια ανάγνωση στο κανάλι d και η τιμή που διαβάζεται πολλαπλασιάζεται επί 2. Η τιμή αυτή περνιέται στην εγγραφή του χώρου εργασίας της Compute στη θέση της παραμέτρου r. Φυσικά είναι προφανές οτι πρόκειται για παράμετρο τιμής και όχι διεύθυνσης. Η περίπτωση της παραμέτρου διεύθυνσης φαίνεται στο παρακάτω παράδειγμα:

 

PROGRAM Sample;  


TYPE intchan= CHANNEL OF INTEGER;


VAR c: intchan;



  PROCEDURE Eval(VAR p: intchan);
    
	...



BEGIN
 
	...


  Eval(c);

 

Σε αυτό το παράδειγμα η κλήση της διαδικασίας Eval συνοδεύεται από το πέρασμα της διεύθυνσης του καναλιού c στην εγγραφή του χώρου εργασίας της Eval στη θέση της παραμέτρου διεύθυνσης p. Με άλλα λόγια τα ονόματα c και p αντιστοιχούν σε ένα και το αυτό κανάλι.

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

 

PROCEDURE Eval(p: intchan);

 

είναι λάθος αφού από τον ορισμό του ένα κανάλι είναι μια διεύθυνση θέσης μνήμης.

 

Α.2.3 Συνδυασμός καναλιών, πινάκων, εγγραφών και δεικτών

 

Οι μεταβλητές καναλιών μπορούν να συνδυαστούν με άλλους δομημένους τύπους της Pascal, όπως πίνακες και εγγραφές. Είδαμε παραδείγματα καναλιών που μετάφεραν πίνακες ή εγγραφές. Επίσης έχουμε παραδείγματα πινάκων καναλιών. Αυτό που δεν επιτρέπεται είναι ένα κανάλι που να μεταφέρει κανάλια, δηλαδή CHANNEL OF CHANNEL (!). Το παράδειγμα που ακολουθεί δείχνει μια πιό σύνθετη χρήση των καναλιών σε συνδυασμό με πίνακες και εγγραφές.

 

TYPE intarr= ARRAY [1..5] OF INTEGER;


VAR r: RECORD


                x, y : INTEGER;


                c : CHANNEL OF intarr;


              END;


          a: intarr;


  ...


BEGIN


  ...


  a := r.c;

 

H εκχώρηση εκτελείται ως εξής: διαβάζονται 5 τιμές ακεραίων από το κανάλι r.c και εκχωρούνται στον πίνακα a.

Η Multi-Pascal επιτρέπει τη δήλωση καναλιού δεικτών, όπως επίσης και δείκτη σε κανάλι. Αυτό επιτρέπει τη δυναμική διαχείριση καναλιών με τη βοήθεια των τελεστών NEW και DISPOSE. Θεωρείστε το παρακάτω παράδειγμα:

 

VAR intchanptr: ^CHANNEL OF INTEGER;


  ...


BEGIN
  ...
  NEW(intchanptr);
  intchanptr^ := 23;
  intchanptr^ := 26;

 

Η εντολή NEW δημιουργεί ένα κανάλι ακεραίων που δείχνεται από τον δείκτη intchanptr. Οι δύο εκχωρήσεις που ακολουθούν εγγράφουν τις τιμές 23 και 26 στο κανάλι αυτό.


     Next             Up               Back              Contents

Επόμενο:A.3 ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΟΥ ΔΕΝ ΥΠΟΣΤΗΡΙΖΟΝΤΑΙ Πάνω: Παράρτημα Α Πίσω: A.1. ΠΕΡΙΒΑΛΛΟΝΤΑ