previous next Up Title Contents Index

8.6.6 Globaalit muuttujat


Muuttujat voidaan esitellä myös globaaleiksi. Mikäli muuttujat esitellään kaikkien ohjelman lausesulkujen ulkopuolella, näkyvät muuttujat kaikille niille lohkoille, jotka on esitelty muuttujan esittelyn jälkeen. Seuraava ohjelma on kaikkea muuta kuin hyvän ohjelmointitavan mukainen, mutta pöytätestaamme sen siitä huolimatta:

c-muut\alisotku.c - parametrin välitystä

	/* 01 */ /* alisotku.c */
	/* 02 */ /* Mitä ohjelma tulostaa?? */
	/* 03 */ #include <stdio.h>
	/* 04 */
	/* 05 */ int a,b,c;
	/* 06 */
	/* 07 */ void ali_1(int *a, int b)
	/* 08 */ {
	/* 09 */   int d;
	/* 10 */   d  = *a;
	/* 11 */   c  = b + 3;
	/* 12 */   b  = d -  1;
	/* 13 */   *a = c -  5;
	/* 14 */ }
	/* 15 */
	/* 16 */ void ali_2(int *a, int *b)
	/* 17 */ {
	/* 18 */   int c;
	/* 19 */   c  = *a + *b;
	/* 20 */   *a = 9 -  c;
	/* 21 */   *b = 32;
	/* 22 */ }
	/* 23 */
	/* 24 */ int main(void)
	/* 25 */ {
	/* 26 */   int d;
	/* 27 */   a=1; b=2; c=3; d=4;
	/* 28 */   ali_1(&d,c);
	/* 29 */   ali_2(&b,&a);
	/* 30 */   ali_1(&c,3+d);
	/* 31 */   printf("%d %d %d %d\n",a,b,c,d);
	/* 32 */   return 0;
	/* 33 */ }
Seuraavassa g.c täytyy tulkita: globaali muuttuja c ja m.d: main- funktion muuttuja d.

globaalit 

main

ali_1

ali_2

laskuja

           

   

   

   

    

*   

   

   

*   

*   

   


   lause  

 a 

 b 

 c 

  d 

  a 

 b 

 d 

  a 

  b 

 c 


27 a=1; b=2

 1 

 2 

 3 

  4 

    

   

   

    

    

   


28 ali_1(&d

   

   

   

    

&m.d

 3 

 ? 

    

    

   

ali_1(&m.d,3)

10 d = *a; 

   

   

   

    

    

   

 4 

    

    

   

= m.d = 4

11 c = b+3;

   

   

 6 

    

    

   

   

    

    

   

= 3+3 = 6

12 b = d-1;

   

   

   

    

    

 3 

   

    

    

   

= 4-1 = 3

13 *a= c-5;

   

   

   

  1 

 <-o

   

   

    

    

   

m.d = g.c-5 = 6-5 = 1

29 ali_2(&b

   

   

   

    

    

   

   

&g.b

&g.a

 ? 

ali_2(&g.b,&g.a)

19 c =*a+*b

   

   

   

    

    

   

   

    

    

 3 

= g.b+g.a = 2+1 = 3

20 *a= 9-c;

   

 6 

   

    

    

   

   

<-o

    

   

g.b = 9-3 = 6 

21 *b= 32; 

32 

   

   

    

    

   

   

    

<-o

   

g.a = 32

30 ali_1(&c

   

   

   

    

&g.c

 4 

 ? 

    

    

   

ali_1(&g.c,3+1)

10 d = *a; 

   

   

   

    

    

   

 6 

    

    

   

= g.c = 6

11 c = b+3;

   

   

 7 

    

    

   

   

    

    

   

= 4+3 = 7

12 b = d-1;

   

   

   

    

    

 5 

   

    

    

   

= 6-1 = 5

13 *a= c-5;

   

   

 2 

    

 <-o

   

   

    

    

   

g.c = c-5 = 7-5 = 2

31 printf("

   

   

   

    

    

   

   

    

    

   

Tulostus: 32 6 2 1

32 return 0

   

   

   

    

    

   

   

    

    

   

          ========= 

Globaaleiden muuttujien käyttöä tulee ohjelmoinnissa välttää. Tuskin mistään on tullut yhtä paljon ohjelmointivirheitä, kuin vahingossa muutetuista globaaleista muuttujista!

Tehtävä 8.76 Muuttujien näkyvyys

Pöytätestaa seuraava ohjelma:

c-muut\alisotk2.cpp - parametrin välitystä

	/* 01 */ /* alisotk2.c */ /* Mitä ohjelma tulostaa?? */
	/* 02 */ #include <stdio.h>
	/* 03 */
	/* 04 */ int b,c;
	/* 05 */
	/* 06 */ void s_1(int *a, int b)
	/* 07 */ {
	/* 08 */   int d;
	/* 09 */   d  = *a;
	/* 10 */   c  = b + 3;
	/* 11 */   b  = d -  1;
	/* 12 */   *a = c -  5;
	/* 13 */ }
	/* 14 */
	/* 15 */ void a_2(int *a, int &b)
	/* 16 */ {
	/* 17 */   c  = *a + b;
	/* 18 */   { int c; c = b;
	/* 19 */   *a = 8 * c; }
	/* 20 */   b = 175;
	/* 21 */ }
	/* 22 */
	/* 23 */ int main(void)
	/* 24 */ {
	/* 25 */   int a,d;
	/* 26 */   a=4; b=3; c=2; d=1;
	/* 27 */   s_1(&b,c);
	/* 28 */   a_2(&d,a);
	/* 29 */   s_1(&d,3+d);
	/* 30 */   printf("%d %d %d %d\n",a,b,c,d);
	/* 31 */   return 0;
	/* 31 */ }


previous next Up Title Contents Index