Προ-αρχικοποίηση παραμέτρων συνάρτησης. Καθορισμός και κλήση συναρτήσεων

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

Με τέτοια δομή πρωτότυπο πρόγραμμαΟι συναρτήσεις που βρίσκονται σε διαφορετικά αρχεία προέλευσης μπορούν να χρησιμοποιούν καθολικές εξωτερικές μεταβλητές. Όλες οι συναρτήσεις στη γλώσσα C είναι εξ ορισμού εξωτερικές και είναι πάντα προσβάσιμες από οποιοδήποτε αρχείο. Για παράδειγμα, εάν ένα πρόγραμμα αποτελείται από δύο αρχεία προέλευσης, όπως φαίνεται στο Σχ. 2, τότε η κύρια συνάρτηση μπορεί να καλέσει οποιαδήποτε από τις τρεις συναρτήσεις fun1, fun2, fun3 και καθεμία από αυτές τις συναρτήσεις μπορεί να καλέσει οποιαδήποτε άλλη.

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

Στη γλώσσα SI, ένα μπλοκ είναι μια ακολουθία δηλώσεων, ορισμών και δηλώσεων που περικλείονται σε τιράντες. Υπάρχουν δύο τύποι μπλοκ - μια σύνθετη πρόταση και ένας ορισμός συνάρτησης, που αποτελείται από μια σύνθετη πρόταση, η οποία είναι το σώμα της συνάρτησης, και μια κεφαλίδα συνάρτησης που προηγείται του σώματος (που περιλαμβάνει το όνομα της συνάρτησης, τους τύπους επιστροφής και τις τυπικές παραμέτρους ). Τα μπλοκ μπορούν να περιλαμβάνουν σύνθετες δηλώσεις, αλλά όχι ορισμούς συναρτήσεων. Το εσωτερικό μπλοκ ονομάζεται ένθετο, και εξωτερική μονάδα- ολοκληρωμένη.

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

Όλες οι συναρτήσεις στο SI έχουν συνολική διάρκεια ζωής και υπάρχουν καθ' όλη τη διάρκεια του χρόνου εκτέλεσης του προγράμματος.

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

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

Ένα αντικείμενο μπορεί να γίνει καθολικά ορατό με κατάλληλες δηλώσεις σε όλα τα αρχεία προέλευσης που απαρτίζουν το πρόγραμμα.

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

Αντικείμενα των τάξεων auto και register έχουν τοπική ώραζωή. Οι στατικοί και εξωτερικοί προσδιοριστές ορίζουν αντικείμενα με συνολική διάρκεια ζωής.

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

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

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

Ο προσδιοριστής κλάσης μνήμης καταχωρητή δίνει εντολή στον μεταγλωττιστή να εκχωρήσει μνήμη για μια μεταβλητή σε έναν καταχωρητή, αν είναι δυνατόν. Η χρήση της μνήμης καταχωρητή συνήθως οδηγεί σε μειωμένο μεταβλητό χρόνο πρόσβασης. Μια μεταβλητή που δηλώνεται με την κλάση αποθήκευσης καταχωρητή έχει το ίδιο εύρος με μια αυτόματη μεταβλητή. Ο αριθμός των καταχωρητών που μπορούν να χρησιμοποιηθούν για τιμές μεταβλητών περιορίζεται από τις δυνατότητες του υπολογιστή και εάν ο μεταγλωττιστής δεν έχει ελεύθερους καταχωρητές στη διάθεσή του, τότε η μεταβλητή εκχωρείται μνήμη όπως για την κατηγορία auto. Η κλάση μνήμης καταχωρητή μπορεί να καθοριστεί μόνο για μεταβλητές με πληκτρολογήστε intή δείκτες με μέγεθος ίσο με το μέγεθος του int.

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

Παράδειγμα: /* δηλώνει τη μεταβλητή i σε εσωτερικό επίπεδο με την κλάση μνήμης στατική. */ /* αρχείο πηγής file1.c */ main() ( ... ) fun1() ( static int i=0; ... ) /* αρχείο πηγής file2.c */ fun2() ( static int i= 0; ... ) fun3() (static int i=0; ...)

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

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

Μια μεταβλητή που δηλώνεται τοπικά με την κλάση αποθήκευσης extern είναι μια αναφορά σε μια μεταβλητή με το ίδιο όνομα που ορίζεται καθολικά σε ένα από τα αρχεία προέλευσης του προγράμματος. Ο σκοπός μιας τέτοιας δήλωσης είναι να κάνει ορατό τον ορισμό της μεταβλητής σε παγκόσμιο επίπεδο μέσα στο μπλοκ.

Παράδειγμα: /* δηλώνει τη μεταβλητή i, η οποία είναι το όνομα ενός εξωτερικού πίνακα μεγάλων ακεραίων, σε τοπικό επίπεδο */ /* αρχείο πηγής file1.c */ main() ( ... ) fun1() ( extern long i ; ... ) /* αρχείο προέλευσης file2.c */ long i=(0);

fun2() ( ... ) fun3() ( ... )

Η δήλωση του i ως εξωτερικό στο παραπάνω παράδειγμα το κάνει ορατό μέσα στο fun1. Ο ορισμός αυτής της μεταβλητής είναι στο file2.c σε παγκόσμιο επίπεδο και θα πρέπει να υπάρχει μόνο μία, ενώ μπορεί να υπάρχουν πολλές δηλώσεις με την κλάση μνήμης extern. Απαιτείται δήλωση με εξωτερική κλάση μνήμης όταν είναι απαραίτητο να χρησιμοποιηθεί μια μεταβλητή που περιγράφεται στο ρεύμααρχείο προέλευσης , αλλά χαμηλότερα στο κείμενο του προγράμματος, δηλ. πριν το ολοκληρώσετεπαγκόσμιο ορισμό

. Το ακόλουθο παράδειγμα επεξηγεί αυτή τη χρήση μιας μεταβλητής που ονομάζεται st.

Παράδειγμα: main() ( extern int st; ... ) static int st=(0);

διασκέδαση1() (...)

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

1. Η μεταβλητή δηλώνεται με την κλάση μνήμης στατική. Μια τέτοια μεταβλητή μπορεί να αρχικοποιηθεί με μια ρητή σταθερή έκφραση ή με μια προεπιλεγμένη τιμή μηδέν. Δηλαδή, οι δηλώσεις static int i=0 και static int i είναι ισοδύναμες και και στις δύο περιπτώσεις στη μεταβλητή i θα εκχωρηθεί η τιμή 0.

2. Η μεταβλητή δηλώνεται χωρίς καθορισμό κλάσης μνήμης, αλλά με ρητή προετοιμασία. Σε αυτήν τη μεταβλητή εκχωρείται η κλάση στατικής μνήμης από προεπιλογή. Δηλαδή, οι δηλώσεις int i=1 και static int i=1 θα είναι ισοδύναμες.

Μια μεταβλητή που δηλώνεται καθολικά είναι ορατή στο υπόλοιπο του αρχείου προέλευσης στο οποίο έχει οριστεί. Πάνω από την περιγραφή της και σε άλλα αρχεία προέλευσης, αυτή η μεταβλητή είναι αόρατη (εκτός αν έχει δηλωθεί με την κλάση extern).

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

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

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

1.6.2. Δηλώσεις Λειτουργίας

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

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

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

2. Μια συνάρτηση που δηλώνεται με την κλάση εξωτερικής μνήμης είναι ορατή σε όλα τα αρχεία προέλευσης του προγράμματος. Οποιαδήποτε συνάρτηση μπορεί να καλέσει συναρτήσεις με την κλάση εξωτερικής μνήμης.

3. Εάν δεν υπάρχει προσδιοριστής κλάσης μνήμης στη δήλωση συνάρτησης, τότε η κλάση extern θεωρείται από προεπιλογή.

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

1.6.3. Διάρκεια ζωής και εύρος αντικειμένων λογισμικού

Η διάρκεια ζωής μιας μεταβλητής (συνολικής ή τοπικής) καθορίζεται σύμφωνα με τους ακόλουθους κανόνες.

1. Μια μεταβλητή που δηλώνεται καθολικά (δηλαδή εκτός όλων των μπλοκ) υπάρχει σε όλη την εκτέλεση του προγράμματος.

2. Οι τοπικές μεταβλητές (δηλαδή που δηλώνονται μέσα σε ένα μπλοκ) με καταχωρητή ή κατηγορία αυτόματης μνήμης έχουν διάρκεια ζωής μόνο για την περίοδο εκτέλεσης του μπλοκ στο οποίο δηλώνονται. Εάν μια τοπική μεταβλητή δηλωθεί με μια κλάση μνήμης στατικής ή εξωτερικής, τότε έχει διάρκεια ζωής για τη διάρκεια ολόκληρου του προγράμματος.

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

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

2. Μια μεταβλητή, που δηλώνεται ή ορίζεται τοπικά, είναι ορατή από το σημείο της δήλωσης ή του ορισμού μέχρι το τέλος τρέχον μπλοκ. Μια τέτοια μεταβλητή ονομάζεται τοπική.

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

4. Οι συναρτήσεις με στατική κατηγορία μνήμης είναι ορατές μόνο στο αρχείο προέλευσης στο οποίο έχουν οριστεί. Όλες οι άλλες λειτουργίες είναι ορατές σε όλο το πρόγραμμα.

Οι ετικέτες στις συναρτήσεις είναι ορατές σε ολόκληρη τη λειτουργία.

Τα επίσημα ονόματα παραμέτρων που δηλώνονται στη λίστα παραμέτρων ενός πρωτοτύπου συνάρτησης είναι ορατά μόνο από το σημείο της δήλωσης παραμέτρων μέχρι το τέλος της δήλωσης συνάρτησης.

1.6.4. Εκκίνηση καθολικών και τοπικών μεταβλητών

Κατά την προετοιμασία, πρέπει να τηρείτε τους ακόλουθους κανόνες:

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

2. Οι καθολικές μεταβλητές αρχικοποιούνται πάντα και, εκτός εάν αυτό γίνει ρητά, αρχικοποιούνται στο μηδέν.

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

4. Η εκκίνηση των μεταβλητών με την κατηγορία μνήμης auto ή καταχωρητή πραγματοποιείται κάθε φορά που εισάγετε το μπλοκ στο οποίο δηλώνονται. Εάν δεν υπάρχει αρχικοποίηση μεταβλητών στη δήλωση, τότε η αρχική τους τιμή είναι απροσδιόριστη.

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

Παράδειγμα: int global_var;

int func(void) ( int local_var; /* default auto */ static int *local_ptr=&local_var; /* αυτό είναι λάθος */ static int *global_ptr=&global_var; /* αυτό είναι σωστό */ register int *reg_ptr=&local_var; /* και έτσι σωστά */ )

[

Στο παραπάνω παράδειγμα, η καθολική μεταβλητή global_var έχει μια καθολική διάρκεια ζωής και μια μόνιμη διεύθυνση στη μνήμη και αυτή η διεύθυνση μπορεί να χρησιμοποιηθεί για την προετοιμασία του στατικού δείκτη global_ptr. Η τοπική μεταβλητή local_var, η οποία έχει μια κατηγορία μνήμης auto, εκχωρείται στη μνήμη μόνο όταν εκτελείται η συνάρτηση func, η διεύθυνση αυτής της μεταβλητής δεν είναι σταθερή και δεν μπορεί να χρησιμοποιηθεί για την προετοιμασία της στατικής μεταβλητής local_ptr. Για να αρχικοποιήσετε τη μεταβλητή τοπικού μητρώου reg_ptr, μπορείτε να χρησιμοποιήσετε μη σταθερές εκφράσεις και, ειδικότερα, τη διεύθυνση της μεταβλητής local_ptr.

Αρχικοποίηση

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

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

, δεν μπορεί να περιέχει αρχικοποιητή.

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

Εκκίνηση μεταβλητών κλάσης μνήμης αυτοΚαι μητρώοεκτελείται κάθε φορά που εισάγετε ένα μπλοκ (εκτός από την εισαγωγή ενός μπλοκ χρησιμοποιώντας τον τελεστή πήγαινε) στο οποίο δηλώνονται. Εάν παραληφθεί ένας αρχικοποιητής σε μια δήλωση μεταβλητής κατηγορίας μνήμης αυτοή μητρώο, τότε η αρχική του τιμή δεν ορίζεται. Αρχικοποίηση μεταβλητών μιγαδικών τύπων (πίνακας, δομή, ένωση) που έχουν κλάση μνήμης αυτο, απαγορεύεται στο SP MSC, αλλά επιτρέπεται στο SP TS ακόμα και για μεταβλητές που δηλώνονται με τροποποιητή συνθ. Μεταβλητές σύνθετου τύπουέχοντας ένα μάθημα μνήμης στατικός, μπορεί να αρχικοποιηθεί εσωτερικά.

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

Από το βιβλίο της C++ από τον Hill Murray

5.2.4 Αρχικοποίηση Η χρήση συναρτήσεων όπως η set_date() για την παροχή αρχικοποίησης ενός αντικειμένου κλάσης είναι άκομψη και επιρρεπής σε σφάλματα. Εφόσον πουθενά δεν αναφέρεται ότι το αντικείμενο πρέπει να αρχικοποιηθεί, ο προγραμματιστής μπορεί να ξεχάσει να το κάνει, ή (αυτό

Από το βιβλίο Οδηγός βοήθειαςσε C++ συγγραφέας Stroustrap Bjarne

6.6 Εκχώρηση και αρχικοποίηση Θεωρήστε μια πολύ απλή κλάση συμβολοσειράς string:struct string (* char* p; int size; // μέγεθος του διανύσματος που δείχνει το pstring(int sz) (* p = νέος χαρακτήρας; *) ~string() (* διαγραφή p; *) * Μια συμβολοσειρά είναι μια δομή δεδομένων που αποτελείται από ένα διάνυσμα χαρακτήρων και το μήκος αυτού του διανύσματος. Διάνυσμα

Από το βιβλίο Idioms and Styles C++ του Makhmutov Albert

Από το βιβλίο System Programming in περιβάλλον Windows από τον Χαρτ Τζόνσον Μ

R.12.6 Initialization Ένα αντικείμενο μιας κλάσης χωρίς κατασκευαστές, χωρίς ιδιωτικά ή προστατευμένα μέλη, όχι εικονικές λειτουργίεςκαι χωρίς βασικές κλάσεις μπορούν να αρχικοποιηθούν χρησιμοποιώντας μια λίστα αρχικοποιητών (§R.8.4.1). Ένα αντικείμενο κλάσης με κατασκευαστή πρέπει να αρχικοποιηθεί ή να έχει

Από το βιβλίο Υποδομές δημόσια κλειδιά συγγραφέας Polyanskaya Olga Yurievna

Από το βιβλίο The C Programming Language for προσωπικός υπολογιστής συγγραφέας Bochkov S. O.

Βήμα 12 - Εκκίνηση σε δύο βήματα. Όταν δημιουργούμε μια παρουσία χωρίς στοίβα, γράφουμε τον ακόλουθο κώδικα: CClass* cc = new CClass(), Ας προσπαθήσουμε να το καταλάβουμε. new είναι ένας παγκόσμιος τελεστής με τον ορισμό: void* operator new (size_t bytes) Λαμβάνει από τον μεταγλωττιστή τον αριθμό των byte που απαιτούνται για την αποθήκευση του αντικειμένου.

Από το βιβλίο QNX/UNIX [Anatomy of Concurrency] συγγραφέας Τσιλουρίκ Όλεγκ Ιβάνοβιτς

Υποστηρίζεται η προετοιμασία του Winsock Winsock API DLL(WS2_32.DLL), για να αποκτήσετε πρόσβαση στην οποία πρέπει να συνδέσετε τη βιβλιοθήκη WS_232.LIB στο πρόγραμμα. Αυτό το DLL θα πρέπει να προετοιμαστεί χρησιμοποιώντας τη μη τυπική, ειδική για το Winsock συνάρτηση WSAStartup, η οποία θα πρέπει να είναι η πρώτη από

Από το βιβλίο The C Language - A Guide for Beginners από την Prata Steven

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

Από το βιβλίο Προγραμματισμός για Linux. Επαγγελματική προσέγγιση του Μίτσελ Μαρκ

Αρχικοποίηση Σε μια μεταβλητή σε μια δήλωση μπορεί να εκχωρηθεί μια αρχική τιμή μέσω ενός αρχικοποιητή. Η καταχώρηση του αρχικοποιητή στη δήλωση προηγείται από ένα σύμβολο ίσου =<инициализатор>Οι μεταβλητές οποιουδήποτε τύπου μπορούν να αρχικοποιηθούν. Οι συναρτήσεις δεν αρχικοποιούνται.

Από το βιβλίο C++ για αρχάριους από τον Lippman Stanley

Αρχικοποίηση παραμέτρων int pthread_mutexattr_init(const pthread_mutexattr_t* attr Η συνάρτηση προετοιμάζει τη δομή του χαρακτηριστικού mutex που επισημαίνεται από την παράμετρο attr). Ο τύπος δεδομένων pthread_mutexattr_t ορίζεται στο αρχείο (προέρχεται από τον τύπο sync_attr_t, ο οποίος με τη σειρά του ορίζεται στο αρχείο

Από το βιβλίο του συγγραφέα

Αρχικοποίηση Mutex int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr Η δομή δεδομένων pthread_mutex_t ορίζεται στο αρχείο). (προέρχεται ο τύπος από τον τύπο sync_t, ο οποίος με τη σειρά του ορίζεται στο αρχείο ) και έχει την ακόλουθη μορφή: struct _sync_t ( /* Μετρητής για αναδρομικό

Από το βιβλίο του συγγραφέα

Αρχικοποίηση δομής Είδαμε πώς αρχικοποιούνται οι μεταβλητές και οι πίνακες: int count = 0;static int fibo=(0, 1, 1, 2, 3, 5, 8); Ναι, εάν η μεταβλητή δομής είναι εξωτερική ή στατική. Εδώ θα πρέπει να ληφθεί υπόψη ότι

Από το βιβλίο του συγγραφέα

5.2.2. Αρχικοποίηση σηματοφόρου Η εκχώρηση και η προετοιμασία ενός σηματοφόρου είναι δύο διαφορετικές λειτουργίες. Για να αρχικοποιήσετε έναν σηματοφόρο, καλέστε τη συνάρτηση semctl(), περνώντας το δεύτερο όρισμα ίσο με μηδέν, και το τρίτο όρισμα είναι ίσο με τη σταθερά SETALL. Το τέταρτο όρισμα πρέπει να είναι τύπου union semun, field

Από το βιβλίο του συγγραφέα

7.9.2. Αρχικοποίηση και αντιστοίχιση Υπενθυμίζεται ότι ένα όνομα πίνακα χωρίς τον καθορισμό ενός ευρετηρίου στοιχείου ερμηνεύεται ως η διεύθυνση του πρώτου στοιχείου. Ομοίως, ένα όνομα συνάρτησης χωρίς παρενθέσεις μετά από αυτό ερμηνεύεται ως δείκτης συνάρτησης. Για παράδειγμα, κατά τον υπολογισμό

Από το βιβλίο του συγγραφέα

14.1. Αρχικοποίηση μιας κλάσης Λάβετε υπόψη τον ακόλουθο ορισμό κλάσης: class Data (public:int ival;char *ptr;);Για να χρησιμοποιήσετε με ασφάλεια ένα αντικείμενο κλάσης, πρέπει να αρχικοποιήσετε τα μέλη του σωστά. Ωστόσο, το νόημα αυτής της ενέργειας είναι για διαφορετικές τάξειςδιαφορετικός. Για παράδειγμα, can ival

Από το βιβλίο του συγγραφέα

14.6. Memberwise Initialization A Η προετοιμασία ενός αντικειμένου μιας κλάσης από ένα άλλο αντικείμενο της ίδιας κλάσης, όπως: Account oldAcct("Anna Livia Plurabelle");Account newAcct(oldAcct) ονομάζεται προεπιλεγμένη προετοιμασία μέλους. Από προεπιλογή - επειδή γίνεται αυτόματα, ανεξάρτητα

Ταξινόμηση δεικτών συνάρτησης

Ορισμός δείκτη συνάρτησης

Δείκτες συνάρτησης

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

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

Υπάρχουν δύο τύποι δεικτών συνάρτησης στο C:

· δείκτης – έκφραση,

· μεταβλητή δείκτη.

38.9.3. Δείκτης – έκφραση

Όπως σημειώθηκε παραπάνω, μια παράσταση δείκτη είναι μια παράσταση της οποίας η τιμή είναι η διεύθυνση μιας συνάρτησης. Ας δώσουμε ένα παράδειγμα.

Έστω να υπάρχει ένα πρωτότυπο μιας συνάρτησης για τον υπολογισμό του τετραγώνου ενός αριθμού διπλού τύπου. Τότε η έκφραση &sqr είναι μια έκφραση δείκτη. Εδώ & είναι ένας τελεστής μονής διεύθυνσης, ο οποίος δίνει εντολή στον μεταγλωττιστή να υπολογίσει τη διεύθυνση της συνάρτησης.

38.9.4. Δείκτης - μεταβλητή

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

(* <α>) (<γ>)

* - χειριστής αποαναφοράς,

α – αναγνωριστικό του δηλωμένου δείκτη,

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

· γ – λίστα τύπων παραμέτρων συνάρτησης στους οποίους μπορεί να ρυθμιστεί ο δείκτης.

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

διπλό (*pf)(διπλό);

Αυτή είναι μια δήλωση μεταβλητής. Όνομα μεταβλητής pf. η τιμή αυτής της μεταβλητής μπορεί να είναι η διεύθυνση οποιασδήποτε συνάρτησης που παίρνει μία παράμετρο τύπου double και που επιστρέφει τιμές τύπου double.

Λαμβάνοντας υπόψη τα παραπάνω, μπορούμε να πούμε ότι ο ορισμός ενός δείκτη συνάρτησης καθορίζει το σύνολο των συναρτήσεων με τις οποίες μπορεί να χρησιμοποιηθεί. Η μεταβλητή δείκτη pf που δηλώθηκε παραπάνω μπορεί να λειτουργήσει, για παράδειγμα, με τις ακόλουθες συναρτήσεις.

διπλό τετράγωνο (διπλό x)
{

διπλός κύβος (διπλός x)
{

επιστροφή x * x * x;

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



διπλό (*pf)(διπλό);

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

διπλό *pf(διπλό);

Η παράσταση που προκύπτει είναι μια δήλωση μιας συνάρτησης που παίρνει μια παράμετρο τύπου double και επιστρέφει έναν δείκτη τύπου double*. Για να βεβαιωθούμε για αυτό, ας θυμηθούμε ότι η σύνταξη των δηλώσεων στη γλώσσα C περιέχει τη σύνταξη των εκφράσεων. Για να προσδιορίσετε τον σκοπό του ονόματος pf στην εν λόγω έκφραση, εξετάστε την υποέκφραση *pf(double). Εδώ εφαρμόζονται δύο τελεστές στο όνομα pf: * και () . Η ερμηνεία του ονόματος pf εξαρτάται από τις προτεραιότητες αυτών των τελεστών. Αν κοιτάξετε τον πίνακα προτεραιότητας τελεστή, μπορείτε να δείτε ότι ο τελεστής συνάρτησης () έχει υψηλότερη προτεραιότητα από τον τελεστή αναφοράς *. Συνεπάγεται ότι ο τελεστής () δεσμεύει το όνομα pf πιο έντονα από τον τελεστή *. Έτσι, μέσα νέα έκδοσηΤο pf είναι όνομα συνάρτησης, όχι όνομα δείκτη.

Τώρα ας επιστρέψουμε στην αρχική διαφήμιση.

διπλό (*pf)(διπλό);

Οι πρώτες παρενθέσεις σε αυτήν την έκφραση συνδυάζουν τη σειρά ομαδοποίησης τελεστών και τελεστών. Τώρα το όνομα pf γίνεται το όνομα του δείκτη.

Δείκτης – Μια μεταβλητή μπορεί να αρχικοποιηθεί τη στιγμή της δήλωσης της είτε με μηδενικό δείκτη είτε με τη διεύθυνση μιας συνάρτησης του τύπου στον οποίο μπορεί να οριστεί ο δείκτης.

Έστω δύο συναρτήσεις που έχουν τα ακόλουθα πρωτότυπα.

διπλό sqr (διπλό x);
διπλός κύβος (διπλός x);

Ας δηλώσουμε τρεις δείκτες συνάρτησης:

διπλός (*pf1)(διπλός) =
διπλός (*pf2)(διπλός)= κύβος;

διπλό (*pf3)(διπλό)= 0;

Η σύνταξη με την οποία δηλώνονται οι δύο πρώτες μεταβλητές (pf1 και pf2) είναι ελαφρώς διαφορετική. Η σύνταξη με την οποία δηλώνεται η πρώτη μεταβλητή (pf1) είναι αναμφισβήτητη ως προς την ορθότητά της. Στα δεξιά του σημείου εκχώρησης υπάρχει μια έκφραση της οποίας η τιμή είναι η διεύθυνση της συνάρτησης. Μπορεί να υπάρχουν αμφιβολίες για την ορθότητα της δεύτερης δήλωσης, όπου δηλώνεται η μεταβλητή pf2. Αυτή η δήλωση χρησιμοποιεί το όνομα της συνάρτησης αντί για τη διεύθυνσή της ως αρχικοποιητή. Ωστόσο, αυτός ο κώδικας μεταγλωττίζεται μια χαρά. Το γεγονός είναι ότι η γλώσσα C πάντα στον κώδικα όπου αναμένεται ένας δείκτης σε μια συνάρτηση και εμφανίζεται ένα όνομα συνάρτησης, μετατρέπει αυτόματα το όνομα της συνάρτησης σε δείκτη.

Σχόλιο. Η λειτουργία αρχικοποίησης εκτελείται επίσης όταν χρησιμοποιείται ο εκθέτης συνάρτησης ως επίσημη παράμετρος της συνάρτησης.

Η λίστα των παραμέτρων στον ορισμό και το πρωτότυπο μιας συνάρτησης, εκτός από την αντιστοίχιση των τύπων των παραμέτρων, έχει έναν ακόμη σκοπό.

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

Οι ακόλουθες γραμμές δείχνουν ένα παράδειγμα δήλωσης συνάρτησης με αρχικοποίηση παραμέτρων. Η συνάρτηση XX χρησιμοποιείται για την προετοιμασία της παραμέτρου ww.

int ZZ(int tt, int ww = XX(BigVal));

Η δεύτερη παράμετρος μπορεί να αρχικοποιηθεί με αυτόν τον τρόπο, χωρίς να προσδιορίζεται καθόλου το όνομά της. Η σύνταξη της δήλωσης σας επιτρέπει να το κάνετε αυτό!

int ZZ(int tt, int = XX(BigVal));

Η μόνη προϋπόθεση για μια τέτοια αρχικοποίηση είναι ο τύπος της παραμέτρου να ταιριάζει με τον τύπο της παράστασης της οποίας η τιμή χρησιμοποιείται κατά την αρχική προετοιμασία.

Τα πρωτότυπα λειτουργιών μπορούν να εντοπιστούν σε διαφορετικά πεδία. Μπορεί ακόμη και να τοποθετηθεί στο σώμα της καθορισμένης λειτουργίας. Κάθε δήλωση συνάρτησης μπορεί να περιέχει τις δικές της επιλογές για δήλωση και αρχικοποίηση παραμέτρων. Ωστόσο, πολλαπλές δηλώσεις της ίδιας συνάρτησης εντός του ίδιου εύρους δεν επιτρέπουν την εκ νέου αρχικοποίηση των παραμέτρων. Πρέπει να υπάρχει ένα λογικό όριο σε όλα.

Επιπλέον, η C++ έχει έναν άλλο περιορισμό που σχετίζεται με τη σειρά με την οποία αρχικοποιούνται οι παράμετροι εντός του πεδίου εφαρμογής. Η αρχικοποίηση πραγματοποιείται χωρίς αποτυχία από την τελευταία (δεξιά) παράμετρο στη λίστα δηλώσεων παραμέτρων. Η αρχικοποίηση των παραμέτρων δεν επιτρέπει κενά: οι αρχικοποιημένες παράμετροι δεν μπορούν να εναλλάσσονται με μη αρχικοποιημένες παραμέτρους.

int MyF1 (int par1, int par2, int par3, int par4 = 10);

………………………………….

int MyF1 (int par1, int par2 = 20, int par3 = 20, int par4);

………………………………….

int MyF1(int par1 = 100, int, int, int);

#συμπεριλαμβάνω

int f(int, int=4);

int main(int argc, char* argv)

printf("%d\n", f(2)); //8

printf("%d\n", f(2,3)); //6

int f(int a, int b)

Συναρτήσεις με μεταβλητό αριθμό παραμέτρων

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

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

Παραδείγματα συναρτήσεων με μεταβλητό αριθμό παραμέτρων είναι συναρτήσεις από τη βιβλιοθήκη συναρτήσεων γλώσσας SI που εκτελούν λειτουργίες εισαγωγής/εξόδου πληροφοριών (printf, scanf, κ.λπ.). Η συνάρτηση printf() στη βιβλιοθήκη δηλώνεται ως εξής:

int printf(const char* ...);

Αυτό διασφαλίζει ότι κάθε φορά που καλείται η printf(), το πρώτο όρισμα τύπου const char* θα μεταβιβαστεί σε αυτό. Τα περιεχόμενα αυτής της συμβολοσειράς, που ονομάζεται συμβολοσειρά μορφής, καθορίζουν εάν χρειάζονται πρόσθετα ορίσματα κατά την κλήση. Εάν υπάρχουν μεταχαρακτήρες στη συμβολοσειρά μορφής που ξεκινούν με το σύμβολο %, η συνάρτηση περιμένει την παρουσία αυτών των ορισμάτων.

Ο προγραμματιστής μπορεί να αναπτύξει τις συναρτήσεις του με μεταβλητό αριθμό παραμέτρων. Για να εξασφαλιστεί βολικό τρόποΓια πρόσβαση στα ορίσματα μιας συνάρτησης με μεταβλητό αριθμό παραμέτρων, υπάρχουν τρεις ορισμοί μακροεντολών (μακροεντολές) va_start, va_arg, va_end, που βρίσκονται στο αρχείο κεφαλίδας stdarg.h. Αυτές οι μακροεντολές υποδεικνύουν ότι μια συνάρτηση που αναπτύχθηκε από το χρήστη έχει έναν αριθμό απαιτούμενων ορισμάτων που ακολουθούνται από έναν μεταβλητό αριθμό προαιρετικών ορισμών. Τα απαιτούμενα ορίσματα είναι προσβάσιμα μέσω των ονομάτων τους, όπως και όταν καλείτε μια κανονική συνάρτηση. Για να ανακτήσετε προαιρετικά ορίσματα, χρησιμοποιήστε τις μακροεντολές va_start, va_arg, va_end με την ακόλουθη σειρά.

Η μακροεντολή va_start έχει σχεδιαστεί για να ορίζει το όρισμα arg_ptr στην αρχή της λίστας προαιρετικών παραμέτρων και μοιάζει με μια συνάρτηση με δύο παραμέτρους:

void va_start(arg_ptr, prav_param);

Η παράμετρος prav_param πρέπει να είναι η τελευταία απαιτούμενη παράμετρος της συνάρτησης που καλείται και ο δείκτης arg_prt πρέπει να δηλωθεί με προκαθορισμό σε μια λίστα μεταβλητών τύπου va_list με τη μορφή:

va_list arg_ptr;

Η μακροεντολή va_start πρέπει να χρησιμοποιηθεί πριν από την πρώτη χρήση της μακροεντολής va_arg.

Η μακροεντολή va_arg παρέχει πρόσβαση στην τρέχουσα παράμετρο της καλούμενης συνάρτησης και μοιάζει επίσης με μια συνάρτηση με δύο παραμέτρους

type_arg va_arg(arg_ptr,type);

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

Η μακροεντολή va_end χρησιμοποιείται μετά την επεξεργασία όλων των παραμέτρων συνάρτησης και ορίζει τον προαιρετικό δείκτη λίστας παραμέτρων σε NULL.

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

#συμπεριλαμβάνω

#συμπεριλαμβάνω

int sred_znach(int,...);

n=sred_znach(2,3,4,-1);

/* κλήση με τέσσερις παραμέτρους */

printf("n=%d\n",n);

/* κλήση με τέσσερις παραμέτρους */

n=sred_znach(5,6,7,8,9,-1);

/* κλήση με έξι παραμέτρους */

int sred_znach(int x,...)

int i=0, j=0, άθροισμα=0;

va_start(uk_arg,x);

/* ορίστε τον δείκτη uk_arg σε */

/* πρώτη προαιρετική παράμετρος */

αν (x!=-1) άθροισμα=x; /* ελέγξτε αν η λίστα είναι κενή */

αλλιώς επιστροφή (0);

sum+=i;

/* στο τέλος της λίστας */

va_end(uk_arg);

#συμπεριλαμβάνω

#συμπεριλαμβάνω

/* κλείσιμο της λίστας των παραμέτρων */

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

/* κλήση με τέσσερις παραμέτρους */

int sred_znach2(int,...);

n=sred_znach2(3,2,3,4);

int sred_znach2(int n,...)

int *pPointer = για (int i=n ; i; i--) Άθροισμα += *(++pPointer);Κατά τη δημιουργία

προϊόντα λογισμικού

Είναι απαραίτητο να μπορούμε να λειτουργούμε με σαφήνεια και αποτελεσματικότητα με όλη την απαραίτητη ορολογία. Για παράδειγμα, πάρτε μια λέξη όπως η προετοιμασία. Τι είναι αυτό, ξέρεις; Αμφιβάλλω, διαφορετικά δεν θα διαβάζατε αυτό το άρθρο. Επομένως, ας δούμε τι σημαίνει αυτός ο όρος, ποιοι τύποι υπάρχουν και επίσης ας δούμε διάφορα προβλήματα που μπορεί να προκύψουν κατά τη χρήση ηλεκτρονικών. Αρχικοποίηση - τι είναι;Αυτό είναι το όνομα για τις διαδικασίες δημιουργίας, ενεργοποίησης, προετοιμασίας για εργασία και ορισμού

απαιτούμενες παραμέτρους

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

  1. Παραδείγματα Ας δούμε τι είναι η προετοιμασία. Τι είναι αυτό; Θα είναι ευκολότερο να γίνει κατανοητό χρησιμοποιώντας μερικά πραγματικά παραδείγματα:Υπό προετοιμασία μαγνητικός δίσκοςο σκληρός δίσκος κατανοεί τη μορφοποίησή του. Αυτό μπορεί επίσης να περιλαμβάνει την καταχώρηση
  2. πληροφορίες διαχείρισης
  3. (ετικέτες τόμου, περιγραφείς κομματιών και παρόμοιοι χειρισμοί). Αρχικοποίηση προγράμματος σημαίνει τη ρύθμιση των απαραίτητων μεταβλητών ή τον μηδενισμό των μεταβλητών του προγράμματος (μετρητές, διευθύνσεις, διακόπτες, δείκτες) πριν από την εκτέλεση της ίδιας της εφαρμογής. Όλα εγκαθίστανται σύμφωνα με το τι γίνεται για αυτόν τον τύπο λογισμικού ή περιέχονται με τη μορφή οδηγιών στο ίδιο το αρχείο.εκτυπωτή και προσφέρουν στον χρήστη μια επιλογή που μπορεί να υλοποιηθεί με τον υπάρχοντα εξοπλισμό.

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

Τι το προκαλεί στο Sims-3

Η πιο συνηθισμένη έκδοση του προβλήματος είναι 0x0175dcbb. Αυτός ο αριθμός χρησιμοποιείται για να υποδείξει συγκεκριμένα προβλήματα με την προετοιμασία της εφαρμογής. Μπορεί να προκύψει λόγω του γεγονότος ότι βασικό παιχνίδιέρχεται σε διένεξη με πρόσθετα, mods και προγράμματα οδήγησης κάρτας βίντεο που ήταν εγκατεστημένα στον υπολογιστή. Επιπλέον, δεν είστε ασφαλισμένοι ακόμη και κατά την αγορά παιχνίδι με άδεια χρήσης- εάν υπάρχει πρόβλημα, η άδεια δεν θα το λύσει αυτόματα.

Τι πρέπει να κάνετε εάν το σφάλμα 0x0175dcbb υπάρχει ήδη;

Προέκυψε λοιπόν ένα σφάλμα. Τώρα ας δούμε πώς μπορούμε να το αφαιρέσουμε. Αν και θα εξετάσουμε ένα παιχνίδι, πολλές από τις γνώσεις που γράφονται παρακάτω μπορούν επίσης να είναι χρήσιμες όταν εργάζεστε με σοβαρές εφαρμογές. Να θυμάστε ότι περισσότερο παλιό πρόβλημα- αυτά είναι αρχαϊκά εξαρτήματα λογισμικού. Πρώτα απ 'όλα, μας ενδιαφέρουν τα προγράμματα οδήγησης κάρτας γραφικών. Μπορείτε να τα κατεβάσετε από τους ιστότοπους των κατασκευαστών, αυτό ακριβώς κάναμε. Θα ήταν επίσης καλή ιδέα να εγκαταστήσετε ή να ενημερώσετε με την πιο πρόσφατη Εκδόσεις NETΠλαίσιο - συνιστάται να το κάνετε αυτό από τον πόρο του προγραμματιστή, ο οποίος είναι η Microsoft.

Τώρα ας σημειώσουμε τις πιο δημοφιλείς αιτίες του προβλήματος: πρόσθετα mods που γράφτηκαν τρίτους προγραμματιστές. Σε τέτοιες περιπτώσεις, δυστυχώς, θα πρέπει να αφαιρέσετε την ίδια την επέκταση. Εάν υπάρχουν πληροφορίες που σας εμποδίζουν να το κάνετε αυτό, μπορείτε απλά να μετονομάσετε το φάκελο Mods. Εάν παρουσιαστεί σφάλμα μετά την εγκατάσταση, πρέπει να απεγκαταστήσετε το ίδιο το πρόγραμμα χρησιμοποιώντας το πρόγραμμα απεγκατάστασης και να το εγκαταστήσετε ξανά. Εάν όλα αυτά δεν βοηθήσουν (και αυτό συμβαίνει συχνά), τότε μπορούμε να συμπεράνουμε ότι ο δίσκος όπου βρίσκεται το ίδιο το παιχνίδι είναι κατεστραμμένος. Και η μόνη συνετή λύση είναι να το ανταλλάξετε (ή να κατεβάσετε μια πειρατική έκδοση από torrent).

Σύναψη

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