C ++ vektor abonnement ut av rekkefeil

C ++ vektor abonnement ut av rekkefeil
Når et abonnement utenfor rekkevidde er utstedt av et C ++ -program, er abonnementet som brukes til å få tilgang til et element i vektoren utenfor Vektorindeksene utenfor Vector Indexes. Dette avhenger imidlertid av kompilatoren. Med G ++ -kompilatoren for Ubuntu, når abonnementet er utenfor området, returneres standardverdien eller en annen verdi, eller forstått å være der ved cellen. Dette skjer bare når vektoren allerede er definert med noen elementer. Med G ++ -kompilatoren, når vektoren er deklarert uten noe element, og det blir gjort et forsøk på å få tilgang til et beslektet minneplass (uten noe element i det), ved å bruke et hvilket som helst abonnement heltall (til og med 0), utsteder G ++ -kompilatoren feilen: " Segmenteringsfeil (kjernedumped) ”.

Før du fortsetter å lese, er det behov for å huske følgende: et abonnement er indeksen i firkantede parenteser for vektortavnet. Denne indeksen brukes til å referere til elementet i vektoren. Hver indeks refererer til et bestemt element (verdi). Indekstelling begynner fra 0 og slutter ved vektorisering - 1. Så hvis en vektor har 10 elementer, er det første elementet ved indeks 0, og det tiende elementet er ved indeks 9. Bruke indeks 10 på vektoren for å lese eller endre verdien til et element ved indeks 10, som ikke eksisterer, bør sende ut en feilmelding utenfor rekkevidde. Imidlertid, med G ++ -kompilatoren, så lenge en vektor er blitt definert (minne tildelt for elementene, selv om de er standardelementer), når en indeks utenfor området brukes, er standardverdien til vektorelementtypen eller noen annen Verdien av typen returneres (eller er det for å bli endret).

Utenfor range illustrasjon

Tenk på tabellen nedenfor:

EN B C D E F G H Jeg J
-2 -1 0 1 2 3 4 5 6 7 8 9 10 11

Den første raden viser hvordan ti minnefordelinger er laget for 10 tegn. Under tegnene i tabellen, i den andre raden, er de riktige abonnementene (indekser). Ved hjelp av abonnementet -1, -2, -3 osv., bør resultere i utstedt utenfor rekkevidde. Bruker av abonnementet 10, 11, 12 osv., bør også resultere i utstedt utenfor rekkevidde.

Denne artikkelen illustrerer situasjoner der utenfor rekkevidde er utstedt. Kompilatoren som brukes til kodeprøvene i denne artikkelen er G ++ -kompilatoren for Ubuntu. Ikke glem å inkludere vektorbiblioteket i programmet, for noen kompilator.

Utenomfeil for definert vektor

En definert vektor er en som minnet er tildelt for de første elementene. Verdiene kan være standard eller praktiske verdier for vektorelementtypen. En deklarert vektor uten noen form for initialisering er ikke en definert vektor. For en slik vektor er det ingen minnetildeling for noe vektorelement. En slik vektor er tom.

G ++ kompilator for Ubuntu

Anta at det er ti elementer i en vektor; En ikke uvanlig feil gjort av mennesker som er uerfarne i programmering, er å få tilgang til det tiende elementet med abonnementet på 10. Det bør nås med abonnementet på 9, ettersom indekstelling begynner fra 0. Tenk på følgende program med 10 elementer i vektoren, og tilgang til det tiende elementet med indeksen på 10:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

VectorVtr = 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'i', 'J';
char ch = vtr [10]; // Feilklæring
cout<retur 0;

Dette programmet med G ++ -kompilatoren for Ubuntu gir en utgang av, ", som er en karakter av ingenting (ingen plass). Et tegn på ingenting er standardkarakteren for tegn i C++. Det er ingen ellevte betegnelse for denne vektoren. Så den andre uttalelsen er en feiluttalelse som ikke blir oppdaget av G ++ -kompilatoren. Med G ++ -kompilatoren blir den fremdeles ikke oppdaget ved kjøretid, og programmet fungerer feil.

Noen andre kompilatorer

Når programmet ovenfor brukes sammen med noen andre kompilatorer, blir feiluttalelsen oppdaget ved kjøretid, og et unntak kastes med en feilmelding utstedt ved utgangen. Feilen blir fremdeles ikke oppdaget på kompileringstidspunktet, skjønt.

Tenk på følgende erklæring:

vektor VTR (10);

Dette ser kanskje ikke ut som en definisjon, men det er en definisjon. Det er ti minneplasser for de ti vektorelementene med standard karakterverdi.

Out-of-Range-feil for udefinert vektor

En deklarert vektor uten noen form for initialisering er ikke en definert vektor. For en slik vektor er det ingen tildeling for noe vektorelement. En slik vektor er tom.

G ++ kompilator for Ubuntu

Når en deklarert vektor ikke har noen initialisering (eller ikke har noen standardverdier), er bruken av abonnement ikke aktuelt for vektoren når det gjelder å få tilgang til noe element i vektoren, da det er ikke. Selv nullindeksen kan ikke brukes til å få tilgang til det første elementet, som ikke er til stede. I det følgende programmet blir det gjort et forsøk på å få tilgang til det første elementet, som ikke er til stede:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

VectorVtr;
char ch = vtr [0]; // Feilklæring
cout<retur 0;

Den første uttalelsen i hovedfunksjonen erklærer en vektor uten noe minneplass for noen av dens elementer. Denne uttalelsen er ikke en definisjon. Den andre uttalelsen prøver å lese verdien ved indeks 0. Dette er en feilserklæring fordi vektoren ikke har noe element, og at ingen elementer er til stede ved noen indeks null.

Med G ++ -kompilatoren sammenstiller programmet vellykket, men ved kjøretid, når den andre uttalelsen i hovedfunksjonen er nådd, stopper programmet og følgende feilmelding er utstedt:

Segmenteringsfeil (kjernedumped)

Noen andre kompilatorer

Utførelse av programmet ovenfor i andre kompilatorer, og å merke seg tilsvarende feilmeldinger blir overlatt som en øvelse for leseren.

Konklusjon

Vektorabonnement utenfor rekkevidde oppstår når det blir gjort et forsøk på å få tilgang til et vektorelement ved hjelp av et abonnement som er utenfor indeksområdet. Feil utenfor rekkevidde er ikke det samme som segmenteringsfeil (kjernedumped) hele tiden.