2787


0x08 graphic
Programowanie komputerów

mgr Teresa Podhorska

Zawartość tematyczna:

  1. Zasięg deklaracji zmiennych

  2. Specyfikatory klas pamięci

    1. auto

    2. register

    3. static

    4. extern

  1. Programy wieloplikowe

1. Zasięg deklaracji zmiennych

Rozróżnia się 4 rodzaje zasięgów:

- lokalny: nazwa zadeklarowana w bloku jest lokalna dla tego bloku, można jej używać wewnątrz tego bloku i wewnątrz bloków w nim zawartych.

- funkcji: zakres taki to tekst programu od miejsca deklaracji do końca funkcji. Taki zakres mają np. deklaracje parametrów funkcji.

- pliku: dla nazwy zadeklarowanej na zewnątrz wszystkich bloków i klas, jej zasięg obejmuje cały plik. Zmienna ta nazywa się globalną.

- klasy

long n; - zmienna globalna

void f (int z){ //z- zmienna lokalna

n=z;

cout<<n;

int n=0; // n- zmienna lokalna

while (n!=3) // wieczna petla

{

cout<<n;

float n=1.4; //n- zmienna lokalna

// po usunięciu deklaracji float n=1.4; pętla while kończy się po 1 obrocie

if (n<13) n=3;

cout<<n;

}

cout<<n;

}

void main(){

cout<<n;

f (-9);

cout<<n;

}

2. Specyfikatory klas pamięci

Mamy następujące specyfikatory klas pamięci:

- auto

- extern

- static

- register

2.1. Zmienne automatyczne

Wszystkie zmienne deklarowane wewnątrz funkcji są lokalne dla danej funkcji. Żadna inna funkcja nie ma do nich bezpośredniego dostępu.

Każda zmienna lokalna funkcji, zaczyna żyć w chwili wywołania funkcji, a znika po jej zakończeniu.

Z tego typu obiektami wiąże się słowo kluczowe auto :

auto int x;

Deklarator auto jest prawie zawsze nadmiarowy.

Jest on rzadko używany, ponieważ obiekty są definiowane jako automatyczne przez domniemanie.

Deklaracja:

int x; jest równoważna auto int x;

int f (int n){

auto int i, s=0; // lokalne

for (i=1; i<n; i++) s=s+i;

return (s);

}

void main (){

auto int k; // zmienne lokalne

k=f (5);

.....

}

2.1. Zmienne register

Deklaracja register jest deklaracją auto, ale niesie więcej informacji. Informuje kompilator, że zmienna będzie często używana i należy ją umieszczać jeśli można w rejestrach przez co znacznie zwiększa sie szybkość progamu.

Kompilator może tą deklarację zignorowac jeśli np. ilość zmiennych zadeklarowanych jako register jest większa niż liczba rejestrów lub gdy w programie pobierany jest adres tej zmiennej.

Deklaracje tej zmiennej ma postać: register int x;

2.2. Zmienne globalne

Zmienne zewnętrzne w stosunku do wszystkich funkcji, nazywamy globalnymi. Oznacza to, że są one dostępne poprzez nazwę we wszystkich funkcjach pliku. Zmienne globalne są wstępnie inicjowane zerami

long k; - globalna

void main (){

......

}

Zmienna globalna może być zdefiniowana tylko jeden raz czyli tylko jeden raz można przydzielić jej pamięć. Taka zmienna musi być także deklarowana we wszystkich funkcjach które chcą mieć do niej dostęp - należy to zrobić poprzez deklaracje extern:

lib.cpp:

extern int stala; // extern int stala=12;

int stosuj_stala (int x, int y) {

int z;

z= x + y * stala;

return (z);

}

plik.cpp:

int stala; //int stala=1;

#include <iostream.h>

#include <math.h>

#include ”c:\lib\lib.cpp”

void main (){

int w; float p;

w=stosuj_stala (5,6);

cout<<w;

p = stala * pow10 (w);

}

2.3. Zmienne statyczne

Są to zmienne deklarowane przy pomocy słowa kluczowego static. Można ją stosować do zmiennych globalnych i lokalnych. Są wstępnie inicjowane zerami .

Nie można zadeklarować argumentów formalnych funkcji static lub extern.

Specyfikator static można stosować do nazw obiektów i funkcji oraz unii anonimowych;

Lokalne zmienne statyczne są tak samo lokalne dla funkcji, jak zmienne automatyczne. Jednak w przeciwieństwie do automatycznych nie pojawiają się i nie znikają razem z wywołaniem funkcji, lecz istnieją między jej wywołaniami. Czyli przy powtórnym wejściu do funkcji zmienna ma wartość taką jaka miała przy opuszczaniu funkcji.

Globalne zmienne ze specyfikatorem static ogranicza dostępność zmiennej do modułu gdzie ją zdefiniowano.

plik.cpp:

#include <iostream.h>

static char x[10]; // łączone wewnętrznie

static int y = 10; // łączone wewnętrznie

void pisz_static();

void main ()

{

cout<<y; // y=10

static_lib(); // y=12

...

}

Odwołanie do zmiennych:

static char x[10];

static int y=0;

w innym module ze słowem extern nie jest możliwe.

lib.cpp:

extern static char x[10]; - błąd

extern static int y=10; - błąd

Przykład

#include <iostream.h>

a=1;

void f(){

int b=1;

static int licznik=1;

cout <<*a=*<<a++;

<<*b=*<<b++;

<<*licznik=*<<licznik;

licznik++;

}

void main(){

while (a<4) f();

}

Ekran:

a=1 b=1 licznik =1

a=2 b=1 licznik =2

a=3 b=1 licznik =3

3. Programy wieloplikowe

#include <iostream.h>

float globalna; //zmienne globalne są zerowane

float fun (int nr){

return nr+globalna;

}

void main (){

int a;

cin<<a;

globalna=fun (a);

cout<<globalna<<endl;

}

Umieszczamy program w dwóch plikach:

Kompilacja:

1plik: test.cpp -zawiera program główny.

#include <iostream.h>

float fun (int );

float globalna;

void main (){

int a;

cin<<a;

globalna=fun (a);

cout<<globalna<<endl;

}

2 plik: lib.cpp -zawiera definicje funkcji.

#include <iostream.h>

extern float globalna; //słowo kluczowe extern informuje kompilator,

//że, zmienna została zadeklarowana w innym pliku

float fun (int nr){

return (nr+globalna);

}

Aby umożliwić osobne kompilowanie, programista musi dostarczyć deklaracji z informacjami o typach, które są potrzebne by można było analizować plik w izolacji od reszty programu.

£ączenie:

1. W programie głównym dodajemy linię #include *lib.cpp*

#include <iostream.h>

#include *d:\lib\lib.cpp*

//float fun (int ); zbędna deklaracja

float globalna;

void main (){

int a;

cin<<a;

globalna=fun (a);

cout<<globalna<<endl;

}

Nie jest to sposób polecany i nie zawsze możemy go stosować, należy wykorzystywać mechanizm pokazany w sposobie nr 2.

2. Projekt:

Menu: Project | Open

podajemy nazwę test.prj

otwiera się okno o nazwie Project: test

dodajemy pliki: (listwa dolna Add lub klawisz Ins)

pliki lib.cpp

test.cpp

Przykład 1:

plik.cpp program główny:

#include <iostream.h>

float fun (int );

float globalna;

void main (){

int a;

cin<<a;

globalna=fun (a);

cout<<globalna<<endl;

}

lib.cpp zawiera definicje funkcji.

extern float globalna;

float fun (int nr){return (nr+globalna);}

Przykład 2:

plik.cpp

#include <iostream.h>

#include ”d:\inc_h\fun.h” // float fun (int nr);

static int s = 12;

void main (){

cout<<”static main”<<x<<endl;

static_lib();

}

lib.cpp

#include <iostream.h>

static int x = 20;

void static_lib (){cout<<x<<endl;}

fun.h

void static_lib ();

Przykład 3:

plik.cpp

#include <iostream.h>

#include ”d:\inc_h\fun.h” // float fun (int nr);

#include ”d:\inc_h\global.h” //float globalna;

void main (){

int a;

cin<<a;

globalna=fun (a);

cout<<globalna<<endl;

}

lib.cpp:

#include ”d:\inc_h\extern.h” //extern float globalna;

float fun (int nr){return (nr+globalna);}

fun.h

float fun (int nr);

global.h

float global;

extern.h

extern float globalna;

Przykład 4:

plik.cpp program główny

#include <iostream.h>

#include ”d:\inc_h\fun.h” // float fun (int nr);

float globalna = 20;

void main (){

float w, globalna = 10;

globalna=fun (1);

cout<<w<<endl;

globalna = w;

cout << globalna<<endl<<::globalna;

::globalna=w;

}

lib.cpp definicje funkcji

#include ”d:\inc_h\extern.h” //extern float globalna;

float fun (int nr){

return (nr+globalna);

}

Programowanie w jêzyku C/C++

6

wykład 8/dzienne

Wykład 8

semestr III - studia dzienne



Wyszukiwarka

Podobne podstrony:
2787
2787
2787
2787
2787
2787
2787

więcej podobnych podstron