Πρότυπα |
Το πρότυπο είναι ένα μοντέλο του πραγαμτικού και οι σύγχρονοι μεταφραστές C δίνουν τη δυνατότητα να ορίσουμε ένα πρότυπο γιά κάθε συνάρτηση που ορίζουμε. Με αυτό το πρότυπο ο μεταφραστής μπορεί να ελέγχει κατά πόσο οι κλήσεις της συνάρτησης είναι συμβατές με τον ορισμό της, όσον αφορά στον αριθμό και τον τύπο των παραμέτρων καθώς και τον τύπο της συνάρτησης. Η χρήση προτύπων συνιστάται αλλά δεν επιβάλλεται από το ANSI standar της C. Γι' αυτό οι μεταφραστές έχουν συνήθως μιά διακοπτική επιλογή που ενεργοποιεί ή οχι τον έλεγχο προτύπων, ή ακόμη ενεργοποιούν αυτόματα την επιλογή ανάλογα με τη σύνταξη του προγράμματος που μεταφράζουν.. Αν επιστρέψουμε στις πρώτες γραμμές 3, 4 και 5 του αρχείου SCOPE.C θα δούμε τα πρότυπα των τριών συναρτήσεων που χρησιμοποιούνται στο πρόγραμμα. Η λέξη void που βρίσκεται πριν από το όνομα κάθε συνάρτησης σημαίνει ότι η συνάρτηση δεν επιστρέφει τιμή, άρα δεν μπορεί να κληθεί ως έκφραση από το πρόγραμμα. Επομένως μιά πρόταση της μορφής index = head1(); θα προκαλούσε λάθος στο συντακτικό έλεγχο του προγράμματος. Εδώ ας σημειωθεί οτι στα πλαίσια της προγραμματιστικής ευελιξίας που επιτρέπει η C μπορούμε μιά συνάρτηση να την καλούμε με διαφορετικούς τρόπους ανάλογα με τις απαιτήσεις μας. Δηλαδή το οτι, γιά παράδειγμα, μιά συνάρτηση επιστρέφει κάποια τιμή αυτό δεν σημαίνει οτι ο προγραμματιστής ενδιαφέρεται να τη χρησιμοποιήσει κάθε φορά. Εάν δεν υπήρχε η λέξη void επομένως ο μεταφραστής δεν θα μπορούσε να ξέρει αν η συνάρτηση δεν επιτρέφει τιμή ή επιστρέφει ακέραια τιμή. Αυτή είναι μιά υπερβολική ίσως ελευθερία που 'τακτοποιείται' με τα πρότυπα. Η λέξη void μέσα στις παρενθέσεις που ακολουθούν το όνομα μιάς συνάρτησης σημαίνει οτι η συνάρτηση δεν δέχεται καμμία παράμετρο, επομένως κλήση με καποια έκφραση ανάμεσα στις παρενθέσεις θα προκαλέσει λάθος. Προσέξτε ακόμη τη χρήση της λέξης void πριν από το main. Δεδομένου οτι και η main είναι μιά συνάρτηση μπορεί και αυτή τόσο να δεχτεί όσο και να επιστρέψει τιμές στο λειτουργικό σύστημα που εκτελεί το πρόγραμμα. Η επικοινωνία του κυρίως προγράμματος με το περιβάλλον εξετάζεται αργότερα. Εδώ απλά επισημαίνεται οτι η λέξη void σημαίνει οτι το πρόγραμμα δεν επιστρέφει καμμία τιμή στο σύστημα. Το πρόγραμμα που ακολουθεί είναι ίδιο με το πρόγραμμα FLOATSQ.C μ ετη μόνη διαφορά ότι έιναι γραμμένο με χρήση προτύπων. Εκτός από αυτά που ήδη αναφέρθηκαν προσέξτε τη δήλωση των τυπικών παραμέτρων στις συναρτήσεις. Ακολουθούν το πρότυπο της Pacal, (Modula-2 ή Ada). |
Συναρτήσεις βιβλιοθήκης |
Η γραμμή 2 του αρχείου SCOPE.C αλλά και του FLOATSQ2. C περιέχει μιά εντολή προς τον μεταφραστή, την include η οποία συζητείται αναλυτικά παρακάτω. Η σημασία της είναι οτι το πρόγραμμα δίνει εντολή στον μεταφραστή να ενσωματώσει το αρχείο STDIO.H. Το αρχείο αυτό περιέχει τα πρότυπα των βασικών βιβλιοθηκών εισόδου και εξόδου της C (STandarD Input Output) καθώς επίσης και ορισμένες δηλώσεις σταθερών, τύπων κ.λ.π. που σχετίζονται με την είσοδο και την έξοδο. Η C γιά λόγους μεταφερτότητας και συμβατότητας έχει συγκεντρωμένες όλες τις συναρτήσεις που εξυπηρετούν ομάδες λειτουργιών ή/και εξαρτώνται από το λειτουργικό σύστημα γιά την υλοποίησή τους σε ορισμένες βιβλιοθήκες συναρτήσεων. Υπάρχουν λοιπόν βιβλιοθήκες συνατήσεων γιά είσοδο/έξοδο, γιά διαχείριση χαρακτήρων, γιά δαιχείριση συμβολοσειρών, γιά μαθηματικούς υπολογισμούς, γιά διαχείριση αρχείων, γιά διχείριση μνήμης κ.ο.κ. . Η κάθε βιβλιοθήκη συνοδεύεται από ένα αρχείο - κεφαλή (header, εξ' ου και η κατάληψη .H) που περιέχει τα πρότυπα των συναρτήσεων της βιβλιοθήκης, ορισμούς σταθερών, τύπων δεδομένων, κ.λ.π. 'Οταν θέλουμε να περιλάβουμε συναρτήσεις από τη βιβλιοθήκη στο πρόγραμμά μας πρέπει να συνδέσουμε τη σχετική βιβλιοθήκη. Αυτό επιτυγχάνεται με την εντολή προς το μεταφραστή #include <όνομα αρχείου-κεφαλής> Η συνάρτηση printf που χρησιμοποιούμε γιά την εμφάνιση δεδομένων από το πρώτο σχεδόν πρόγραμμα ανήκει στη βιβλιοθήκη του αρχείου STDIO.H. Επομένως θα ήταν προγραμματιστικά ορθό να περιλάβουμε την εντολή #include <stdio.h> Τα πεζά ή κεφαλαία δεν παίζουν ρόλο αφού βρισκόμαστε σε περιβάλλον DOS. Επειδή πρόκειται γιά τη βασικότερη των βιβλιοθηκών ο μεταφραστής μας έκανε μέχρι τώρα τη χάρη και τη συνέδεε αυτόματα, χωρίς να το ζητήσουμε ρητά. Από εδώ και πέρα όμως είναι σωστό να περιλαμβάνουμε τη παραπάνω εντολή. Η λογική των βιβλιοθηκών είναι κεντρική στη γλώσσα C. Με αυτό τον τρόπο ο μεταφραστής διαχωρίζεται από τα τμήματα που είτε εξαρτώνται από το λειτουργικό ή και από το υπολογιστικό σύστημα. Επίσης οι προσθαφαιρέσεις ή τροποποήσεις συναρτήσεων ή και ολόκληρων βιβλιοθηκων δεν μεταβάλλουν τον βασικό μεταφραστή. Αυτή ίσως είναι και η κύρια δύναμη της C σε σχέση με άλλες πιό 'κλειστές' γλώσσες, όπου αλλαγές σε συναρτήσεις σημαίνουν νέα έκδοση του μεταφραστή. Η λογική της C μοιάζει με τη λογική της 'ανοικτής αρχιτεκτονικής' των προσωπικών υπολογιστών. Παρέχει την υποδομή, ορισμένα βασικά εργαλεία και τους τρόπους επέκτασης του συστήματος (προδιαγραφές). Από εκεί και πέρα είναι δουλειά των κατασκευσατών να την επεκτείνουν. Γενικά υπάρχουν οι λεγόμενες βασικές (standard) βιβλιοθήκες που προβλέπονται στο ANSI standard και αναφέρθηκαν παραπάνω και πρέπει να παρέχονται με κάθε αξιοπρεπή μεταφραστή. Επι πλέον οι καλοί μεταφραστές παρέχουν αρκετές μη-τυποποιημένες (άρα μη μεταφερτές) βιβλιοθήκες συναρτήσεων που αφορούν πρόσβαση στο λειτουργικό σύστημα, στο υλικό του συστήματος, γραφικά, βάσεις δεδομένων και άλλα εξειδικευμένα θέματα. Γιά να μάθει κανείς τι ακριβώς προσφέρει ο μεταφραστής του πρέπει να ανατρέξει στο εγχειρίδιο του μεταφραστή. Υπάρχει τέλος και ένας πολύ μεγάλος αριθμός δημόσιων (public domain) βιβλιοθηκών, συναρτήσεων και προγραμμάτων, γιά την επίλυση οποιουδήποτε προβλήματος, φυσικά με κυμαινόμενο βαθμό αξιοπιστίας. Αυτό που πρέπει κανείς να θυμάται πάντα είναι οτι: ΠΡΙΝ ΞΕΚΙΝΗΣΟΥΜΕ ΝΑ ΓΡΑΨΟΥΜΕ ΕΝΑ ΠΡΟΓΡΑΜΜΑ ΕΛΕΓΧΟΥΜΕ ΤΙΣ ΔΙΑΘΕΣΙΜΕΣ ΠΗΓΕΣ ΒΙΒΛΙΟΘΗΚΩΝ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΩΝ C. ΠΙΘΑΝΟΤΑΤΑ ΚΑΠΟΙΟΣ ΕΧΕΙ ΓΡΑΨΕΙ ΚΑΤΙ ΠΟΛΥ ΧΡΗΣΙΜΟ. |
![]() |
![]() |
![]() |