![]() ![]() ![]() | Datatyper |
Scope begrebet hjælper os til at forstå, hvor et bestemt navn i program er gyldigt og brugbart. Storage classes er en sondring i C, som bruges til at skelne mellem forskellig lagringer og forskellige synligheder af variable, funktioner, mv.
|
20.1. Scope
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Scope reglerne bruges til at afgøre i hvilke programdele et navn er gyldigt. På dansk kan vi bruge ordet 'virkefelt' i stedet for 'scope'. I store programmer bruges det samme navn ofte i forskellige scopes med forskellige betydninger. |
|
Følgende beskriver den vigtigste af alle scoperegler af alle i C.
|
Den bedste måde at forstå reglerne, som blev omtalt herover, er at bringe dem i spil på et godt eksempel. Et sådant er vist i program 20.1. Nogle vil nok genkende dette eksempel fra afsnit 7.1 (program 7.1) hvor vi diskuterede sammensatte kommandoer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <stdio.h> int main(void) { int a = 5, b = 7, c; c = a + b; { int b = 10, c; { int a = 3, c; c = a + b; printf("Inner: a + b = %d + %d = %d\n", a, b, c); } c = a + b; printf("Middle: a + b = %d + %d = %d\n", a, b, c); } c = a + b; printf("Outer: a + b = %d + %d = %d\n", a, b, c); return 0; } | |||
|
Der vises tre blokke i main, som indlejres i hinanden. I den yderste blok har vi variablene a, b og c. I den mellemste blok har vi b og c, som skygger for b og c fra den yderste blok. I den inderste blok har vi a og c, som igen skygger for hhv. a (fra yderste blok) og c (fra den mellemste blok). Skygningen medfører det vi kalder et "hul i scopet".
Bemærk at vi kan se fra indre blokke ud i ydre blokke, men aldrig omvendt.
Du skal kunne forklare det output, som kommer fra program 20.1. Hvis du kan, har du givetvis styr på blokke og storage class auto. Vi har mere at sige om sidstnævnte - automatiske variable i C - i næste afsnit.
1 2 3 | Inner: a + b = 3 + 10 = 13 Middle: a + b = 5 + 10 = 15 Outer: a + b = 5 + 7 = 12 | |||
|
20.2. Storage class auto
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Der findes et lille antal forskellige former for såkaldte storage classes i C, som er vigtige for fastlægelsen af scope af de forskellige navngivne enheder i programmet.
Storage class af variable og funktioner medvirker til bestemmelse af disses scope |
Storage classes angives som en modifier før selve typenavnet i en erklæring:
| |||
|
|
Essentielt set illustrerede vi allerede storage class auto i program 20.1 i afsnittet ovenfor.
|
register storage class er en variant af auto storage class |
Sammenfattende kan vi sige, at storage class auto sammenfatter lokale variable, som oprettes ved indgang i en blok og nedlægges ved udgang af en blok.
20.3. Storage class static af lokale variable
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
En automatisk variabel ophører med at eksistere når den omkringliggende blok ophører med at eksistere. Dette kan f.eks. ske når en funktion returnerer.
Hvis vi ønsker at en lokal variabel overlever blok ophør eller funktionsreturnering kan vi gøre den global (ekstern, se afsnit 20.4). Men vi kan også lave en lokal variabel af storage class static.
I blokke er storage class static et alternativ til storage class auto |
|
|
Lad os illustrere statiske lokale variable med følgende eksempel. Vi ser en funktion accumulating_f, som kaldes 10 gange fra main. I alle kald overføres parameteren 3 til accumulating_f.
I funktionen accumulating_f ser vi med rødt den statiske variabel previous_result, hvori vi gemmer den forrige returværdi fra kaldet af accumulating_f. Kun når funktionen kaldes første gang initialiseres previous_result til 1. (Dette er en vigtig detalje i eksemplet). Hvis ikke previous_result er 1 multipliceres previous_result med funktionens input, og denne størrelse returneres.
Output fra funktionen vises i program 20.4. Hvis vi sletter ordet static fra program 20.3 ser vi let, at alle de 10 kald returnerer værdien af input.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> int accumulating_f (int input){ int result; static int previous_result = 1; if (previous_result == 1) result = input; else result = previous_result * input; previous_result = result; return result; } int main(void) { int i; for (i = 0; i < 10; i++) printf("accumulating_f(%d) = %d\n", 3, accumulating_f(3)); return 0; } | |||
|
1 2 3 4 5 6 7 8 9 10 | accumulating_f(3) = 3 accumulating_f(3) = 9 accumulating_f(3) = 27 accumulating_f(3) = 81 accumulating_f(3) = 243 accumulating_f(3) = 729 accumulating_f(3) = 2187 accumulating_f(3) = 6561 accumulating_f(3) = 19683 accumulating_f(3) = 59049 | |||
|
Statiske lokale variable er et alternativ til brug af globale variable. En statisk lokal variabel bevarer sin værdi fra kald til kald - men er usynlig uden for funktionen. |
Man kunne få den tanke at en variabel som er statisk ikke kan ændres. Dette vil dog være underligt, idet betegnelsen 'variabel' jo næsten inviterer til ændringer. Men 'static' i C har ikke denne konsekvens. Hvis vi i C ønsker at gardere os mod ændringer af en variable skal vi bruge en modifier som hedder const.
20.4. Storage class extern
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Nogle variable og funktioner ønskes at være tilgængelige i hele programmet. For variable opnås dette ved at placere disse uden for funktionerne, og uden for main. Sådanne variable, og funktioner, siges at have external linkage, og de er tilgængelige i hele programmet.
Dog gælder stadig reglen, at en variabel eller funktion ikke kan bruges før det sted i programmet, hvor den er introduceret og defineret. For funktioner bruger vi ofte de såkaldte prototyper til at annoncere en funktion, som vi endnu ikke har skrevet.
|
|
20.5. Storage class static af eksterne variable
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Den sidste storage class vi vil introducere hedder også static, men den virker på eksterne variable. Statiske eksterne variable kan kun ses i den kildefil, hvori de er erklæret.
Statiske eksterne variable har ikke noget at gøre med statiske lokale variable ala afsnit 20.3.
For globale variable virker storage class static som en scope begrænsning i forhold til storage class extern. Statiske globale variable er private i den aktuelle kildefil. |
|
|
Funktioner kan også være statiske, og dermed private i en kildefil. Synlighedskontrol er vigtig i store programmer. Synlighedskontrol er meget vigtig i objekt-orienteret programmering. |