Presentation laddar. Vänta.

Presentation laddar. Vänta.

Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.

Liknande presentationer


En presentation över ämnet: "Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens."— Presentationens avskrift:

1 Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens egenskaper medför var i datorn variabeln kan tänkas lagrad

2 Anders Sjögren Klocka CPU Tangentbord parallellinterface Video RAM Teckengenerator Videokretsar Diskkontroll Expansionsbuss Tilläggskort UART RS232 serieportar Primärminne RAM Bootstrap ROM, BIOS Adressbuss Databuss Kontrollbuss Parallell- port Vid programexekvering finns arbetsminne i CPU:n (register) samt i primärminnet

3 Anders Sjögren Datorns minne programexekvering } Heap Stack Programmets instruktionskod Programarea 0 data Disk Processor Primärminnet, bytes programkoden (maskinkod) hämtas från disk

4 Anders Sjögren Datorns minne programexekvering Heap Stack Programmets instruktionskod 0 data Primärminnet, bytes extern,static CPU med register auto en autovariabel kan hamna i ett register •auto - variabler (automatisk?) är alla ”de vanliga” variabler som man skapar t ex en funktions formella och interna variabler är automatiskt av lagringsklassen auto. •dessa minnen skapas på stacken eller möjligtvis i någon av CPU:s register. •eftersom de skapas på stacken och stacken växer resp minskar dynamiskt när funktioner anropas resp avslutas så medför detta att en auto-variabel bara existerar när funktionen ”är igång”.

5 Anders Sjögren Datorns minne programexekvering Heap Stack Programmets instruktionskod 0 data Primärminnet, bytes extern,static CPU med register auto en autovariabel kan hamna i ett register •auto - variabler (automatisk?) är alla ”de vanliga” variabler som man skapar t ex en funktions formella och interna variabler är automatiskt av lagringsklassen auto. •dessa minnen skapas på stacken eller möjligtvis i någon av CPU:s register. •eftersom de skapas på stacken och stacken växer resp minskar dynamiskt när funktioner anropas resp avslutas så medför detta att en auto-variabel bara existerar när funktionen ”är igång”.

6 Anders Sjögren Lagringsklassen auto #include #define RANTESATS 8.5 float NastaAr( float ); void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { kapital = NastaAr( kapital ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } float NastaAr( float x ) { if ( x > 0 ) x = x * ( 1 + RANTESATS/100 ); else x = x * 1/( 1 + RANTESATS/100 ); return x ; } funktionen main() definierad funktionen TabellPaSkarmen() definierad funktionerna TabellPaSkarm(), NastaAr() deklarerad funktionen NastaAr() definierad

7 Anders Sjögren Datorns minne lagringsklasser Heap Stack Programmets instruktionskod 0 data Primärminnet, bytes extern,static CPU med register auto •när en variabel är deklarerad, definierad utanför en funktion (dvs på den yttersta nivån) blir den, vare sig det står extern framför eller ej, av typen extern •detta innebär att minnes- utrymmet inte skapas på stacken eller heapen vilket gör att minnet finns permanent. Så länge som programmet exe- kverar så länge existerar minnet. •själva ordet extern behövs egentligen inte i ANSI-C, utan man använder det för att markera var en variabel tänks vara deklarerad resp definierad då flera källkodsfiler används.

8 Anders Sjögren Lagringsklassen extern (sidoeffekter) #include #define RANTESATS 8.5 void NastaAr( void ); void TabellPaSkarmen( int ); float kapital; int main ( void ) { intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr ); return 0; } void TabellPaSkarmen( int antalAr ){ int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { NastaAr(); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } void NastaAr( void ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); return ; } •här är ränteprogrammet som innehåller en extern variabel kapital. •när man skapar stora program kan man dela upp källkoden i flera filer.

9 Anders Sjögren Lagringsklassen extern (sidoeffekter) #include #define RANTESATS 8.5 void NastaAr( void ); void TabellPaSkarmen( int ); float kapital; int main ( void ) { intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr ); return 0; } void TabellPaSkarmen( int antalAr ){ int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { NastaAr(); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } void NastaAr( void ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); return ; } •här är ränteprogrammet som innehåller en extern variabel kapital. •när man skapar stora program kan man dela upp källkoden i flera filer. denna del stoppas i filen main.c denna del stoppas i filen funk.c

10 Anders Sjögren Lagringsklassen extern (sidoeffekter) #include #define RANTESATS 8.5 void NastaAr( void ); void TabellPaSkarmen( int ); float kapital; int main ( void ) { intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr ); return 0; } void TabellPaSkarmen( int antalAr ){ int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { NastaAr(); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } void NastaAr( void ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); return ; } •för att få dessa filer att tillsammans bli det färdiga programmet så måste vi tala om detta i projektet ( projektfilen). • Då vet kompilator och länkare vad som skall ingå i den färdiga exekverbara filen. denna del stoppas i filen main.c denna del stoppas i filen funk.c

11 Anders Sjögren Lagringsklassen extern (sidoeffekter) enligt praxis betyder extern här ”de- finitionen finns i annan fil” inget extern framför kapital betyder att detta är definitionen av kapital definition av funtionerna finns i denna fil detta betyder deklaration av kapital, definition finns i annan fil projektet

12 Anders Sjögren Lagringsklassen extern (sidoeffekter) enligt praxis betyder extern här ”de- finitionen finns i annan fil” inget extern framför kapital betyder att detta är definitionen av kapital definition av funtionerna finns i denna fil detta betyder deklaration av kapital, definition finns i annan fil projektet •direktivet extern är m a o också tillämpbart på funktioner

13 Anders Sjögren Datorns minne lagringsklasser Heap Stack Programmets instruktionskod 0 data Primärminnet, bytes extern,static CPU med register auto •lagringsklassen register används för att försöka få angiven variabel att lagras i ett av CPU:ns snabba register. Detta gör programmet snabbare. •registerdirektivet är ett råd till kompilatorn att försöka lagra variabeln i ett register. Går inte detta får variabeln lagringsklassen auto istället. •variabeldefinitioner med lagringstyp register bör placeras nära den plats där de används

14 Anders Sjögren Lagringsklasser register •lagringsklassen register används för att försöka få angiven variabel att lagras i ett av CPU:ns snabba register. Detta gör programmet snabbare. •registerdirektivet är ett råd till kompilatorn att försöka lagra variabeln i ett register. Går inte detta får variabeln lagringsklassen auto istället. •variabeldefinitioner med lagringstyp register bör placeras nära den plats där de används #include #define DELAY 1000000L int main( void ){ register long i; while ( 1 ) { printf("A"); for ( i=1; i < DELAY ; i++ ) ; printf("\tn"); for ( i=1; i < DELAY ; i++ ) ; printf("\td"); for ( i=1; i < DELAY ; i++ ) ; printf("\te"); for ( i=1; i < DELAY ; i++ ) ; printf("\tr"); for ( i=1; i < DELAY ; i++ ) ; printf("\ts"); for ( i=1; i < DELAY ; i++ ) ; printf("\r \t \t \t \t \t \r"); for ( i=1; i < DELAY ; i++ ) ; } return 0; } REGISTER.EXEFOR_1.EXE fungerar om long int = 4 bytes och 32 bitars register

15 Anders Sjögren Datorns minne lagringsklasser Heap Stack Programmets instruktionskod 0 data Primärminnet, bytes extern,static CPU med register auto •lagringsklassen static kan användas inom som utom funktionsblock (block). •en variabel som definieras som static får minnesutrymme med minnesinnehåll som existerar under hela programmets exekvering. •en statisk variabel initieras bara en gång och detta sker när exekveringen startar •variabeln är bara känd inom ”sitt” block, funktion •om en variabel på den ”yttersta” nivån blir klassifierad som static betyder det att den inte kan göras känd utanför den egna källkodsfilen

16 Anders Sjögren Lagringsklassen static #include #define RANTESATS 8.5 float NastaAr( float ); void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { kapital = NastaAr( kapital ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } float NastaAr( float x ) { static char anropadggr = 0; printf("Funktionen NastaAr() anropad %d ggr\n", ++ anropadggr); if ( x > 0 ) x = x * ( 1 + RANTESATS/100 ); else x = x * 1/( 1 + RANTESATS/100 ); return x ; } funktionen main() definierad funktionen TabellPaSkarmen() definierad funktionerna TabellPaSkarm(), NastaAr() deklarerad funktionen NastaAr() definierad i funktionen NastaAr() är det definierad en variabel static char anropadggr som håller reda på hur många ggr som funtionen blir anropad

17 Anders Sjögren Lagringsklassen extern (sidoeffekter) projektet om man tillfogar static på någon funktion eller variabel på den yttersta nivån innebär detta att funktionen, variabeln endast blir känd i den filen static

18 Anders Sjögren Slut


Ladda ner ppt "Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens."

Liknande presentationer


Google-annonser