Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'Datatyper
20.  Scope og storage classes

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 Scope20.4 Storage class extern
20.2 Storage class auto20.5 Storage class static af eksterne variable
20.3 Storage class static af lokale variable
 

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.

Scope af et navn er de dele af en programtekst hvor navnet er kendt og tilgængeligt

Følgende beskriver den vigtigste af alle scoperegler af alle i C.

  • De mest basale scoperegler i C

    • Scopet af et navn er den blok hvori den er erklæret

    • Navne i en blok skygger for tilsvarende navne i omkringliggende blokke

      • Introducerer huller i scope

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;
}
Program 20.1    Illustration af scope i tre indlejrede blokke.

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
Program 20.2    Output fra programmet.

 

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:


storageClass type var1, var2, ..., vari
Syntaks 20.1    Syntaktisk definition af storage classes i variabel erklæringer

Variable med storage class auto kaldes automatiske variable

En automatisk variabel er lokal i en blok, dvs den skabes når blokken aktiveres og nedlægges når blokken forlades

Essentielt set illustrerede vi allerede storage class auto i program 20.1 i afsnittet ovenfor.

  • Storage class auto

    • Default storage class i blokke, herunder kroppe af funktioner

      • Hvis man ikke angiver storage class af variable i blokke er den således auto

    • Man kan angive storage class auto eksplicit med brug af nøgleordet auto

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

En statisk variabel i en blok beholder sin værdi fra en aktivering af blokken til den næste

  • Storage class static         - lokale variable i en blok

    • Skal angives med static som storageClass

    • Variabel initialiseringen udføres ved første aktivering

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;
}
Program 20.3    Illustration af statiske lokale variable - en funktion der husker forrige returværdi.

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
Program 20.4    Output fra programmet.

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.

Variable og funktioner med storage class extern kaldes eksterne variable

En ekstern variabel eller funktion er global tilgængelig i hele programmet

  • Storage class extern

    • Default storage class af variable som erklæres uden for funktioner

    • Default storage class af alle funktioner er også extern

    • "External linkage"

 

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.

En statisk variabel på globalt niveau er kun synlig i den aktuelle kildefil

  • Storage class static         - globale variable

    • Skal angives med static som storage class

    • Synlighed i den aktuelle kompileringsenhed - kildefil

    • Kun synlig fra det punkt i filen hvor variablen er erklæret

    • "Internal linkage"

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.

Genereret: Onsdag 7. Juli 2010, 15:11:30
Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'