c errors undefined reference
πώς να κάνετε μια επίθεση ddos
Αυτό το σεμινάριο περιγράφει λεπτομερώς τα κρίσιμα σφάλματα που συχνά αντιμετωπίζουν οι προγραμματιστές στο C ++, όπως η Απροσδιόριστη Αναφορά, ένα Σφάλμα Τμηματοποίησης (πυρήνας με απόρριψη) και το Άλυτο Εξωτερικό Σύμβολο:
Θα συζητήσουμε τα πιο σημαντικά σφάλματα που συναντούμε συχνά στο C ++ που είναι εξίσου κρίσιμα. Εκτός από το σύστημα και τα σημασιολογικά σφάλματα και εξαιρέσεις που συμβαίνουν κατά καιρούς, έχουμε και άλλα κρίσιμα σφάλματα που επηρεάζουν τη λειτουργία των προγραμμάτων.
Αυτά τα σφάλματα εμφανίζονται κυρίως στο τέλος του προγράμματος κατά το χρόνο εκτέλεσης. Μερικές φορές το πρόγραμμα δίνει τη σωστή έξοδο και στη συνέχεια εμφανίζεται το σφάλμα.
=> Επισκεφθείτε εδώ για να μάθετε C ++ από το μηδέν.
Τι θα μάθετε:
Σημαντικά σφάλματα C ++
Σε αυτό το σεμινάριο, θα συζητήσουμε τρεις τύπους σφαλμάτων που είναι κρίσιμα από κάθε άποψη προγραμματιστή C ++.
- Απροσδιόριστη αναφορά
- Σφάλμα τμηματοποίησης (ντάμπινγκ πυρήνα)
- Μη επιλυμένο εξωτερικό σύμβολο
Θα συζητήσουμε τις πιθανές αιτίες καθενός από αυτά τα σφάλματα και μαζί με τις προφυλάξεις που μπορούμε να λάβουμε ως προγραμματιστής για να αποτρέψουμε αυτά τα σφάλματα.
Ας αρχίσουμε!!
Απροσδιόριστη αναφορά
Ένα σφάλμα 'Απροσδιόριστη αναφορά' παρουσιάζεται όταν έχουμε μια αναφορά στο όνομα αντικειμένου (κλάση, συνάρτηση, μεταβλητή κ.λπ.) στο πρόγραμμά μας και ο σύνδεσμος δεν μπορεί να βρει τον ορισμό του όταν προσπαθεί να το αναζητήσει σε όλα τα συνδεδεμένα αρχεία αντικειμένων και βιβλιοθήκες .
Έτσι, όταν ο σύνδεσμος δεν μπορεί να βρει τον ορισμό ενός συνδεδεμένου αντικειμένου, εκδίδει ένα σφάλμα 'απροσδιόριστης αναφοράς'. Όπως είναι σαφές από τον ορισμό, αυτό το σφάλμα παρουσιάζεται στα μεταγενέστερα στάδια της διαδικασίας σύνδεσης. Υπάρχουν διάφοροι λόγοι που προκαλούν σφάλμα 'απροσδιόριστης αναφοράς'.
Συζητάμε μερικούς από αυτούς τους λόγους παρακάτω:
# 1) Δεν παρέχεται ορισμός για αντικείμενο
Αυτός είναι ο απλούστερος λόγος για την πρόκληση σφάλματος 'απροσδιόριστης αναφοράς'. Ο προγραμματιστής έχει ξεχάσει απλά να καθορίσει το αντικείμενο.
Εξετάστε το ακόλουθο πρόγραμμα C ++. Εδώ έχουμε καθορίσει μόνο το πρωτότυπο της συνάρτησης και στη συνέχεια το χρησιμοποιήσαμε στην κύρια συνάρτηση.
#include int func1(); int main() { func1(); }
Παραγωγή:
Έτσι, όταν καταρτίζουμε αυτό το πρόγραμμα, εκδίδεται το σφάλμα σύνδεσης που λέει 'απροσδιόριστη αναφορά στο' func1 () ''.
Για να απαλλαγούμε από αυτό το σφάλμα, διορθώνουμε το πρόγραμμα ως εξής παρέχοντας τον ορισμό της συνάρτησης func1. Τώρα το πρόγραμμα δίνει την κατάλληλη έξοδο.
#include using namespace std; int func1(); int main() { func1(); } int func1(){ cout<<'hello, world!!'; }
Παραγωγή:
Γειά σου Κόσμε!!
# 2) Λανθασμένος ορισμός (οι υπογραφές δεν ταιριάζουν) των αντικειμένων που χρησιμοποιούνται
Ακόμα μια άλλη αιτία για το σφάλμα 'απροσδιόριστης αναφοράς' είναι όταν καθορίζουμε λάθος ορισμούς. Χρησιμοποιούμε οποιοδήποτε αντικείμενο στο πρόγραμμά μας και ο ορισμός του είναι κάτι διαφορετικό.
Εξετάστε το ακόλουθο πρόγραμμα C ++. Εδώ κάναμε μια κλήση στο func1 (). Το πρωτότυπο του είναι int func1 (). Αλλά ο ορισμός του δεν ταιριάζει με το πρωτότυπο. Όπως βλέπουμε, ο ορισμός της συνάρτησης περιέχει μια παράμετρο της συνάρτησης.
Έτσι, όταν το πρόγραμμα καταρτίζεται, η συλλογή είναι επιτυχής λόγω του πρωτότυπου και της αντιστοίχισης κλήσεων λειτουργίας. Αλλά όταν ο σύνδεσμος προσπαθεί να συνδέσει την κλήση συνάρτησης με τον ορισμό της, βρίσκει το πρόβλημα και εκδίδει το σφάλμα ως 'απροσδιόριστη αναφορά'.
#include using namespace std; int func1(); int main() { func1(); } int func1(int n){ cout<<'hello, world!!'; }
Παραγωγή:
Έτσι, για την αποφυγή τέτοιων σφαλμάτων, απλώς εξετάζουμε αν οι ορισμοί και η χρήση όλων των αντικειμένων ταιριάζουν στο πρόγραμμά μας.
# 3) Τα αρχεία αντικειμένων δεν είναι σωστά συνδεδεμένα
Αυτό το ζήτημα μπορεί επίσης να προκαλέσει το σφάλμα 'απροσδιόριστη αναφορά'. Εδώ, ενδέχεται να έχουμε περισσότερα από ένα αρχεία προέλευσης και ενδέχεται να τα συντάξουμε ανεξάρτητα. Όταν γίνει αυτό, τα αντικείμενα δεν συνδέονται σωστά και οδηγεί σε 'απροσδιόριστη αναφορά'.
Εξετάστε τα ακόλουθα δύο προγράμματα C ++. Στο πρώτο αρχείο, χρησιμοποιούμε τη συνάρτηση 'print ()' που ορίζεται στο δεύτερο αρχείο. Όταν συλλέγουμε αυτά τα αρχεία ξεχωριστά, το πρώτο αρχείο δίνει 'απροσδιόριστη αναφορά' για τη λειτουργία εκτύπωσης, ενώ το δεύτερο αρχείο δίνει 'απροσδιόριστη αναφορά' για την κύρια λειτουργία.
int print(); int main() { print(); }
Παραγωγή:
int print() { return 42; }
Παραγωγή:
Ο τρόπος επίλυσης αυτού του σφάλματος είναι η ταυτόχρονη συλλογή και των δύο αρχείων ( Για παράδειγμα, χρησιμοποιώντας το g ++).
Εκτός από τις αιτίες που έχουν ήδη συζητηθεί, η 'απροσδιόριστη αναφορά' μπορεί επίσης να προκύψει για τους ακόλουθους λόγους.
# 4) Λάθος τύπος έργου
Όταν καθορίζουμε λανθασμένους τύπους έργων σε C ++ IDE όπως το visual studio και προσπαθούμε να κάνουμε πράγματα που δεν περιμένει το έργο, τότε λαμβάνουμε «απροσδιόριστη αναφορά».
# 5) Χωρίς βιβλιοθήκη
Εάν ένας προγραμματιστής δεν έχει καθορίσει τη διαδρομή της βιβλιοθήκης σωστά ή πλήρως ξεχάσει να την καθορίσει, τότε λαμβάνουμε μια 'απροσδιόριστη αναφορά' για όλες τις αναφορές που χρησιμοποιεί το πρόγραμμα από τη βιβλιοθήκη.
# 6) Τα εξαρτώμενα αρχεία δεν συντάσσονται
Ένας προγραμματιστής πρέπει να διασφαλίσει ότι καταρτίζουμε όλες τις εξαρτήσεις του έργου εκ των προτέρων, έτσι ώστε όταν καταρτίζουμε το έργο, ο μεταγλωττιστής βρίσκει όλες τις εξαρτήσεις και μεταγλωττίζει με επιτυχία. Εάν λείπουν κάποια από τις εξαρτήσεις, τότε ο μεταγλωττιστής δίνει 'απροσδιόριστη αναφορά'.
Εκτός από τις αιτίες που συζητήθηκαν παραπάνω, το σφάλμα 'απροσδιόριστη αναφορά' μπορεί να προκύψει σε πολλές άλλες καταστάσεις. Αλλά η ουσία είναι ότι ο προγραμματιστής έχει κάνει τα λάθη και για να αποφευχθεί αυτό το σφάλμα πρέπει να διορθωθούν.
δωρεάν θυρίδα ασφαλείας μετατροπέα youtube σε mp3
Σφάλμα τμηματοποίησης (απορρίφθηκε ο πυρήνας)
Το σφάλμα 'σφάλμα τμηματοποίησης (πυρήνας με ένδειξη ντάμπινγκ)' είναι ένα σφάλμα που υποδηλώνει καταστροφή της μνήμης. Συνήθως εμφανίζεται όταν προσπαθούμε να αποκτήσουμε πρόσβαση σε μια μνήμη που δεν ανήκει στο πρόγραμμα υπό εξέταση.
Ακολουθούν ορισμένοι από τους λόγους που προκαλούν σφάλμα σφάλματος τμηματοποίησης.
# 1) Τροποποίηση της σταθερής συμβολοσειράς
Εξετάστε το ακόλουθο πρόγραμμα όπου έχουμε δηλώσει μια σταθερή συμβολοσειρά. Στη συνέχεια προσπαθούμε να τροποποιήσουμε αυτήν τη σταθερή συμβολοσειρά. Όταν το πρόγραμμα εκτελείται, εμφανίζεται το σφάλμα που εμφανίζεται στην έξοδο.
#include int main() { char *str; //constant string str = 'STH'; //modifying constant string *(str+1) = 'c'; return 0; }
Παραγωγή:
# 2) Διαχωρισμός δείκτη
Ένας δείκτης πρέπει να δείχνει σε μια έγκυρη θέση μνήμης προτού την αποαναφέρουμε. Στο παρακάτω πρόγραμμα, βλέπουμε ότι ο δείκτης δείχνει προς το NULL που σημαίνει ότι η θέση μνήμης στην οποία δείχνει είναι 0, δηλαδή μη έγκυρη.
Επομένως, όταν την αποαναφέρουμε στην επόμενη γραμμή, στην πραγματικότητα προσπαθούμε να αποκτήσουμε πρόσβαση στην άγνωστη θέση της μνήμης. Αυτό πράγματι οδηγεί σε σφάλμα τμηματοποίησης.
#include using namespace std; int main() { int* ptr = NULL; //here we are accessing unknown memory location *ptr = 1; cout << *ptr; return 0; }
Παραγωγή:
σφάλμα κατάτμησης
Το επόμενο πρόγραμμα δείχνει μια παρόμοια περίπτωση. Σε αυτό το πρόγραμμα επίσης, ο δείκτης δεν δείχνει έγκυρα δεδομένα. Ένας μη αρχικοποιημένος δείκτης είναι τόσο καλός όσο ο NULL και ως εκ τούτου δείχνει επίσης σε άγνωστη θέση μνήμης. Έτσι, όταν προσπαθούμε να το αποαναφέρουμε, οδηγεί σε σφάλμα τμηματοποίησης.
#include using namespace std; int main() { int *p; cout<<*p; return 0; }
Παραγωγή:
σφάλμα κατάτμησης
Προκειμένου να αποφευχθούν τέτοια σφάλματα, πρέπει να διασφαλίσουμε ότι οι μεταβλητές δείκτη στο πρόγραμμα δείχνουν πάντοτε έγκυρες τοποθεσίες μνήμης.
το καλύτερο μέρος για να παρακολουθήσετε μεταγλωττισμένο anime δωρεάν
# 3) Υπερχείλιση στοίβας
Όταν έχουμε αναδρομικές κλήσεις στο πρόγραμμά μας, καταναλώνουν όλη τη μνήμη στη στοίβα και προκαλούν υπερχείλιση της στοίβας. Σε τέτοιες περιπτώσεις, έχουμε το σφάλμα τμηματοποίησης καθώς η εξάντληση της μνήμης στοίβας είναι επίσης ένα είδος καταστροφής της μνήμης.
Εξετάστε το παρακάτω πρόγραμμα όπου υπολογίζουμε το παραγοντικό ενός αριθμού αναδρομικά. Σημειώστε ότι η βασική μας κατάσταση ελέγχει εάν ο αριθμός είναι 0 και μετά επιστρέφει 1. Αυτό το πρόγραμμα λειτουργεί τέλεια για θετικούς αριθμούς.
Αλλά τι συμβαίνει όταν μεταδίδουμε πραγματικά έναν αρνητικό αριθμό σε μια παραγοντική συνάρτηση; Λοιπόν, καθώς η βασική συνθήκη δεν δίνεται για τους αρνητικούς αριθμούς, η συνάρτηση δεν ξέρει πού να σταματήσει και συνεπώς οδηγεί σε υπερχείλιση στοίβας.
Αυτό φαίνεται στην παρακάτω έξοδο που δίνει σφάλμα τμηματοποίησης.
#include using namespace std; int factorial(int n) { if(n == 0) { return 1; } return factorial(n-1) * n; } int main() { cout< Παραγωγή:
Σφάλμα τμηματοποίησης (ντάμπινγκ πυρήνα)
Τώρα για να διορθώσουμε αυτό το σφάλμα, αλλάζουμε ελαφρώς τη βασική συνθήκη και καθορίζουμε επίσης την περίπτωση για αρνητικούς αριθμούς όπως φαίνεται παρακάτω.
#include using namespace std; int factorial(int n) { // What about n <0? if(n <= 0) { return 1; } return factorial(n-1) * n; } int main() { cout<<'Factorial output:'< Παραγωγή:
Παραγοντική παραγωγή: 1
Τώρα βλέπουμε ότι αντιμετωπίζεται το σφάλμα τμηματοποίησης και το πρόγραμμα λειτουργεί καλά.
Μη επιλυμένο εξωτερικό σύμβολο
Το ανεπίλυτο εξωτερικό σύμβολο είναι ένα σφάλμα σύνδεσης που υποδηλώνει ότι δεν μπορεί να βρει το σύμβολο ή την αναφορά του κατά τη διαδικασία σύνδεσης. Το σφάλμα είναι παρόμοιο με την 'απροσδιόριστη αναφορά' και εκδίδεται εναλλακτικά.
Παρακάτω δίσαμε δύο περιπτώσεις όπου μπορεί να προκύψει αυτό το σφάλμα.
# 1) Όταν αναφερόμαστε μια μεταβλητή δομής στο πρόγραμμα που περιέχει ένα στατικό μέλος.
#include struct C { static int s; }; // int C::s; // Uncomment the following line to fix the error. int main() { C c; C::s = 1; }
Παραγωγή:
Στο παραπάνω πρόγραμμα, η δομή C έχει ένα στατικό μέλος που δεν είναι προσβάσιμο στα εξωτερικά προγράμματα. Επομένως, όταν προσπαθούμε να του εκχωρήσουμε μια τιμή στην κύρια συνάρτηση, ο σύνδεσμος δεν βρίσκει το σύμβολο και μπορεί να οδηγήσει σε ένα 'άλυτο εξωτερικό σύμβολο' ή 'απροσδιόριστη αναφορά'.
Ο τρόπος για να διορθώσετε αυτό το σφάλμα είναι να επεκτείνετε ρητά τη μεταβλητή χρησιμοποιώντας το «::» έξω από την κύρια πριν τη χρησιμοποιήσετε.
# 2) Όταν έχουμε εξωτερικές μεταβλητές που αναφέρονται στο αρχείο προέλευσης και δεν έχουμε συνδέσει τα αρχεία που ορίζουν αυτές τις εξωτερικές μεταβλητές.
Η υπόθεση αυτή παρουσιάζεται παρακάτω:
#include #include using namespace std; extern int i; extern void g(); void f() { i++; g(); } int main() {}
Παραγωγή:
Σε γενικές γραμμές, στην περίπτωση ενός «άλυτου εξωτερικού συμβόλου», ο μεταγλωττισμένος κώδικας για οποιοδήποτε αντικείμενο όπως η συνάρτηση δεν βρίσκει ένα σύμβολο στο οποίο αναφέρεται, ίσως επειδή αυτό το σύμβολο δεν ορίζεται στα αρχεία αντικειμένων ή σε καμία από τις βιβλιοθήκες. καθορίζεται στον σύνδεσμο.
συμπέρασμα
Σε αυτό το σεμινάριο, συζητήσαμε μερικά σημαντικά σφάλματα στο C ++ που είναι κρίσιμα και μπορούν να επηρεάσουν τη ροή του προγράμματος και μπορεί ακόμη και να οδηγήσουν σε διακοπή της εφαρμογής. Εξερευνήσαμε τα πάντα σχετικά με το σφάλμα τμηματοποίησης, το ανεπίλυτο εξωτερικό σύμβολο και την ανακρίβεια αναλυτική αναφορά.
Αν και αυτά τα σφάλματα μπορεί να προκύψουν ανά πάσα στιγμή, από τις αιτίες που συζητήσαμε γνωρίζουμε ότι μπορούμε εύκολα να τα αποτρέψουμε αναπτύσσοντας προσεκτικά το πρόγραμμά μας.
=> Διαβάστε το The Easy C ++ Training Series.
Συνιστώμενη ανάγνωση