c errors undefined reference
declanșarea portului față de redirecționarea porturilor pentru jocuri
Acest tutorial detaliază erorile critice pe care programatorii le întâlnesc adesea în C ++, cum ar fi Referința nedefinită, o eroare de segmentare (nucleul care este aruncat) și un simbol extern nerezolvat
Vom discuta despre cele mai importante erori pe care le întâlnim adesea în C ++, care sunt la fel de critice. În afară de erori de sistem și semantice și excepții care apar din când în când, primim și alte erori critice care afectează funcționarea programelor.
Aceste erori apar mai ales spre sfârșitul programului în timpul rulării. Uneori programul oferă o ieșire adecvată și apoi apare eroarea.
=> Vizitați aici pentru a afla C ++ de la zero.
Ce veți învăța:
Erori C ++ importante
În acest tutorial, vom discuta trei tipuri de erori care sunt critice din punctul de vedere al oricărui programator C ++.
- Referinta nedefinita
- Anomalie de segmentare (core-dumping)
- Simbol extern nerezolvat
Vom discuta cauzele posibile ale fiecăreia dintre aceste erori și împreună cu măsurile de precauție pe care le putem lua ca programator pentru a preveni aceste erori.
Să începem!!
Referinta nedefinita
O eroare „Referință nedefinită” apare atunci când avem o referință la numele obiectului (clasă, funcție, variabilă etc.) în programul nostru și linkerul nu își poate găsi definiția atunci când încearcă să o caute în toate fișierele și bibliotecile de obiecte legate. .
Astfel, atunci când linkerul nu poate găsi definiția unui obiect legat, acesta emite o eroare de „referință nedefinită”. După cum este clar din definiție, această eroare apare în etapele ulterioare ale procesului de conectare. Există diverse motive care determină o eroare „referință nedefinită”.
Discutăm câteva dintre aceste motive mai jos:
# 1) Nici o definiție prevăzută pentru obiect
Acesta este cel mai simplu motiv pentru provocarea unei erori de „referință nedefinită”. Programatorul a uitat pur și simplu să definească obiectul.
Luați în considerare următorul program C ++. Aici am specificat doar prototipul funcției și apoi l-am folosit în funcția principală.
#include int func1(); int main() { func1(); }
Ieșire:
Deci, atunci când compilăm acest program, este emisă eroarea linker care spune „referință nedefinită la‘ func1 () ’”.
Pentru a scăpa de această eroare, corectăm programul după cum urmează, oferind definiția funcției func1. Acum programul oferă rezultatul corespunzător.
#include using namespace std; int func1(); int main() { func1(); } int func1(){ cout<<'hello, world!!'; }
Ieșire:
Salut Lume!!
# 2) Definiție greșită (semnăturile nu se potrivesc) obiectelor utilizate
O altă cauză a erorii „referință nedefinită” este atunci când specificăm definiții greșite. Folosim orice obiect din programul nostru, iar definiția acestuia este ceva diferit.
Luați în considerare următorul program C ++. Aici am făcut un apel către func1 (). Prototipul său este int func1 (). Dar definiția sa nu se potrivește cu prototipul său. După cum vedem, definiția funcției conține un parametru al funcției.
Astfel, atunci când programul este compilat, compilarea are succes datorită potrivirii apelului de prototip și funcție. Dar atunci când linkerul încearcă să conecteze apelul de funcție cu definiția sa, găsește problema și emite eroarea ca „referință nedefinită”.
#include using namespace std; int func1(); int main() { func1(); } int func1(int n){ cout<<'hello, world!!'; }
Ieșire:
Astfel, pentru a preveni astfel de erori, verificăm pur și simplu dacă definițiile și utilizarea tuturor obiectelor se potrivesc în programul nostru.
# 3) Fișierele de obiecte nu sunt legate corect
Această problemă poate genera, de asemenea, eroarea „referință nedefinită”. Aici, este posibil să avem mai multe fișiere sursă și le putem compila independent. Când se face acest lucru, obiectele nu sunt legate corect și rezultă „referință nedefinită”.
Luați în considerare următoarele două programe C ++. În primul fișier, folosim funcția „print ()” care este definită în al doilea fișier. Când compilăm aceste fișiere separat, primul fișier oferă „referință nedefinită” pentru funcția de imprimare, în timp ce al doilea fișier oferă „referință nedefinită” pentru funcția principală.
int print(); int main() { print(); }
Ieșire:
int print() { return 42; }
Ieșire:
Modul de a rezolva această eroare este de a compila ambele fișiere simultan ( De exemplu, prin utilizarea g ++).
În afară de cauzele deja discutate, poate apărea „referință nedefinită” din următoarele motive.
# 4) Tip de proiect greșit
Atunci când specificăm tipuri de proiect greșite în ID-urile C ++, cum ar fi studioul vizual și încercăm să facem lucruri la care proiectul nu se așteaptă, atunci obținem „referință nedefinită”.
# 5) Fără bibliotecă
Dacă un programator nu a specificat corect calea bibliotecii sau a uitat complet să o specifice, atunci obținem o „referință nedefinită” pentru toate referințele pe care programul le folosește din bibliotecă.
# 6) Fișierele dependente nu sunt compilate
Un programator trebuie să se asigure că compilăm toate dependențele proiectului în prealabil, astfel încât atunci când compilăm proiectul, compilatorul găsește toate dependențele și să compileze cu succes. Dacă lipsește oricare dintre dependențe, atunci compilatorul oferă „referință nedefinită”.
În afară de cauzele discutate mai sus, eroarea „referință nedefinită” poate apărea în multe alte situații. Dar esențialul este că programatorul a greșit lucrurile și, pentru a preveni această eroare, ar trebui corectate.
cheie de securitate a rețelei pentru hotspot samsung
Anomalie de segmentare (core-dumping)
Eroarea „eroare de segmentare (nucleul aruncat)” este o eroare care indică deteriorarea memoriei. De obicei, apare atunci când încercăm să accesăm o memorie care nu aparține programului luat în considerare.
Iată câteva dintre motivele care cauzează erori de segmentare.
# 1) Modificarea șirului constant
Luați în considerare următorul program în care am declarat un șir constant. Apoi încercăm să modificăm acest șir constant. Când programul este executat, primim eroarea afișată în ieșire.
#include int main() { char *str; //constant string str = 'STH'; //modifying constant string *(str+1) = 'c'; return 0; }
Ieșire:
# 2) Pointer de referință
Un indicator trebuie să indice o locație de memorie validă înainte de a o dereca. În programul de mai jos, vedem că indicatorul indică NULL, ceea ce înseamnă că locația de memorie către care este îndreptată este 0, adică nevalidă.
Prin urmare, atunci când îl referim la următoarea linie, încercăm de fapt să accesăm locația necunoscută a memoriei sale. Acest lucru duce într-adevăr la o eroare de segmentare.
#include using namespace std; int main() { int* ptr = NULL; //here we are accessing unknown memory location *ptr = 1; cout << *ptr; return 0; }
Ieșire:
Eroare de segmentare
Următorul program arată un caz similar. De asemenea, în acest program, indicatorul nu indică date valide. Un pointer neinițializat este la fel de bun ca NULL și, prin urmare, indică și locația de memorie necunoscută. Astfel, atunci când încercăm să-l deferențiem, rezultă o eroare de segmentare.
#include using namespace std; int main() { int *p; cout<<*p; return 0; }
Ieșire:
Eroare de segmentare
Pentru a preveni astfel de erori, trebuie să ne asigurăm că variabilele de pointer din program indică întotdeauna locații de memorie valide.
# 3) Stack Overflow
Când avem apeluri recursive în programul nostru, acestea consumă toată memoria din stivă și provoacă revărsarea stivei. În astfel de cazuri, primim eroarea de segmentare, deoarece epuizarea memoriei stivei este, de asemenea, un fel de corupție a memoriei.
Luați în considerare programul de mai jos în care calculăm factorul unui număr recursiv. Rețineți că starea noastră de bază testează dacă numărul este 0 și apoi returnează 1. Acest program funcționează perfect pentru numerele pozitive.
Dar ce se întâmplă când trecem de fapt un număr negativ la o funcție factorială? Ei bine, deoarece condiția de bază nu este dată pentru numerele negative, funcția nu știe unde să se oprească și, astfel, are ca rezultat o revărsare a stivei.
Acest lucru este prezentat în ieșirea de mai jos care dă eroare de segmentare.
#include using namespace std; int factorial(int n) { if(n == 0) { return 1; } return factorial(n-1) * n; } int main() { cout< Ieșire:
Anomalie de segmentare (core-dumping)
Acum, pentru a remedia această eroare, modificăm ușor condiția de bază și, de asemenea, specificăm cazul pentru numerele negative așa cum se arată mai jos.
#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:'< Ieșire:
Ieșire factorială: 1
Acum vedem că problema de segmentare este rezolvată și programul funcționează bine.
Simbol extern nerezolvat
Simbolul extern nerezolvat este o eroare de linker care indică faptul că nu poate găsi simbolul sau referința acestuia în timpul procesului de conectare. Eroarea este similară cu „referință nedefinită” și este emisă interschimbabil.
Am dat mai jos două cazuri în care poate apărea această eroare.
există o cască vr pentru Xbox One
# 1) Când referim o variabilă de structură în program care conține un membru static.
#include struct C { static int s; }; // int C::s; // Uncomment the following line to fix the error. int main() { C c; C::s = 1; }
Ieșire:
În programul de mai sus, structura C are un membru static care nu este accesibil programelor exterioare. Deci, atunci când încercăm să îi atribuim o valoare în funcția principală, linkerul nu găsește simbolul și poate avea ca rezultat un „simbol extern nerezolvat” sau „referință nedefinită”.
Modul de a remedia această eroare este de a stabili în mod explicit variabila folosind „::” în afara principalului înainte de a o utiliza.
# 2) Când avem referințe variabile externe în fișierul sursă și nu am legat fișierele care definesc aceste variabile externe.
Acest caz este demonstrat mai jos:
#include #include using namespace std; extern int i; extern void g(); void f() { i++; g(); } int main() {}
Ieșire:
În general, în cazul unui „simbol extern nerezolvat”, codul compilat pentru orice funcție de tip obiect nu reușește să găsească un simbol la care face trimitere, poate pentru că acel simbol nu este definit în fișierele obiect sau în oricare dintre biblioteci specificat linkerului.
Concluzie
În acest tutorial, am discutat câteva erori majore în C ++ care sunt critice și care pot afecta fluxul programului și ar putea duce chiar la o blocare a aplicației. Am explorat în detaliu totul despre eroarea de segmentare, simbolul extern nerezolvat și referința nedefinită.
Deși aceste erori pot apărea oricând, din cauzele pe care le-am discutat știm că le putem preveni cu ușurință dezvoltând cu atenție programul nostru.
=> Citiți seria Easy C ++ Training.
Lectură recomandată