Είσοδος και έξοδος στη μνήμη

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

Το πρόγραμμα που είναι αποθηκευμένο στο αρχείο INMEM.C παρουσιάζει ένα 
απλό παράδειγμα εισόδου και εξόδου στη μνήμη.
                                         
Στην αρχή δηλώνονται δύο πίνακες ακεραίων numbers και result, 5 θέσεων ο 
καθένας, και ένας μετρητής index. Ακόμη ορίζεται ένας πίνακας χαρακτήρων 80 
θέσεων με όνομα line. Ο πίνακας numbers αρχικοποιείται με μιά σειρά 
εκχωρήσεων.

Η πρώτη καινούργια συνάρτηση που συναντούμε είναι η sprintf που είναι 
προφανές οτι έχει την παρόμοια σύνταξη και λειτουργία με τη γνωστή μας 
printf. Η μόνη διαφορά είναι οτι ενώ η printf γράφει τις τιμές κάποιων 
μεταβλητών στον απομονωτή οθόνης και από εκεί στη συσκευή stdout η 
sprintf τυπώνει τις τιμές των μεταβλητών σε κάποιον απομονωτή που έχει τη 
μορφή μιάς συβολοσειράς, στη περίπτωσή μας της line. Σε γενική μορφή η 
δήλωση προτύπου είναι
 
int sprintf(char *buffer, char *format_string [,argument...]);

όπου όλα είναι ήδη γνωστά εκτός από τον πίνακα χαρακτήρων buffer που 
αποθηκεύει την εκτύπωση. Σημειώστε οτι η εκτύπωση ακολουθεί τις οδηγίες της 
συμβολοσειράς ελέγχου ακριβώς όπως στην οθόνη. 

Η δεύτερη και τελευταία νέα συνάρτηση είναι η sscanf που είναι αντίστοιχη της 
scanf. Και πάλι, αντί να γίνει ανάγνωση από τη συσκευή stdin, από εκεί στον 
απομονωτή πληκτρολογίου και τελικά εκχώρηση τιμών σε κάποιες μεταβλητές, 
εδώ έχουμε ανάγνωση από κάποιο απομονωτή που έχει τη μορφή μιάς 
συμβολοσειράς, εδώ της line.
 
int sscanf(char *buffer, char *format_string [,argument...]);

Προσέξτε οτι στο πρόγραμμα οι συμβολοσειρές ελέγχου των δύο συναρτήσεων 
sprintf και sscanf είναι επίτηδες διαφορετικές έτσι ώστε να δειχτεί οτι 
μπορούμε να επεξεργαστούμε τη συμβολοσειρά line όπως θέλουμε, χωρίς να 
λάβουμε υπ' όψη τη διαμόρφωση της εγγερφής των στοιχείων. Τελικά σημειώστε 
και τους δύο διαφορετικούς τρόπους διευθυνσιοδότησης των στοιχείων του 
πίνακα result.

Οι εκτυπώσεις του ενδιάμεσου και του τελικού αποτελέσματος πιστοποιούν τις 
μεταφορές δεδομένων που περιγράψαμε. Η εκτύπωση έχει τη μορφή. 

74 18      33 30 97
The final result is 97
The final result is 30
The final result is 33
The final result is 18
The final result is 74

Περιεχόμενα Κεφαλαίου