【第9回】


『内容』

<記憶クラス>

 変数には型宣言(intやfloatなど)が必要であると同時に,記憶クラスも指定する必要がある.変数の記憶クラスには4種類有る.関数にも記憶クラスがあり,その種類は2つである.

「変数」

1. 自動変数デフォルト:指定しないとこれになる 2. レジスタ変数 3. 静的変数 4. 外部変数

「関数」

1. static関数 2. extern関数デフォルト:指定しないとこれになる

『演習』

6.記憶クラスとプリプロセッサ

6.1 記憶クラス

 4種類の記憶クラス,自動変数,レジスタ変数,静的変数,外部変数がある.変数宣言時に,これらの記憶クラスを指定する.

6.1.1 自動変数

 変数は,記憶クラスを指定しない場合(省略した場合)には,自動変数と見なされる.変数を宣言した関数内(中括弧「{}」で囲まれた範囲内)のみで,この変数を使用することができる.この変数を使用していた関数が終了した時点で,この変数の内容は保存するために確保していたメモリが解放される.すなわち,この変数の情報は消滅する.

 教科書p.51の「プログラム6-1」を実行し,その動作を確認せよ.さらに,最後のprintf文を

  printf("x = %d  y = %d  z = %d\n",x,y,z);
としたときに,どのようなエラーが出るか確認してみよ.(教科書p.50の「文法6-1」を参照)


6.1.2 レジスタ変数

 レジスタ変数は,自動変数と取り扱いは同じである.違いは,そのアクセス速度である.CPU内部のレジスタという一時記憶領域に記憶されるので,データへのアクセス速度が速く,頻繁に使用する変数をレジスタ変数としておくことにより,プログラムの実行時間を短縮させることができる.教科書の「文法6-2」を参照しておくこと.


6.1.3 静的変数

 自動変数は,有効範囲の関数(ブロック)を抜けるとメモリ上から消滅し,再度,その関数が呼び出されたときに,新たにメモリ上に領域を確保する.そのため,前の値を保持できない.しかし,静的変数は,一度メモリ上に領域を確保すると,そのプログラムが終了するまでメモリ上に領域を確保し続ける.そのため,再度,その関数が呼び出されたときに,前の値を保持している.

 教科書p.52の「プログラム6-2」と「プログラム6-3」を実行し,その動作の違いを確認せよ.(教科書のp.51の「文法6-3」を参照)


6.1.4 外部変数

 有効範囲がファイル全部に及ぶ.すなわち,どの関数でもその変数を使用することができる.プログラムが実行された時点で,その変数のためのメモリが確保され,プログラムが終了するまで確保し続けられる.

 教科書p.52の「プログラム6-2」を下記のように変更し,その動作を確認せよ.(教科書p.53の「文法6-4」の1.を参照)


    #include<stdio.h>
    void increment(void);
    int data = 0;

    main()
    {
     int i;
     for(i = 0 ; i < 5 ; ++i){
         data++;
         increment();
    }
     printf("\n");
    }

    void increment(void)
    {
     data++;
     printf("data = %d  ",data);
    }

    #include<stdio.h>
    int increment(int);

    main()
    {
     int data = 0;
     int i;
     for(i = 0 ; i < 5 ; ++i){
         data++;
         data=increment(data);
    }
     printf("\n");
    }

    int increment(int x)
    {
     x++;
     printf("data = %d  ",x);
     return(x);
    }

 【練習1】 消費税(本体価格の8%)を計算する関数Taxを作成し,キーボードから入力した本体価格の代金(本体価格+消費税)を表示するプログラムを作成せよ.ただし,
 (1) 関数Taxの引数:本体価格,返り値:消費税
 (2) 関数Taxの引数:なし,返り値:消費税
とする2種類のプログラムを作成すること.
(ヒント:(2)は外部変数を使用する)

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)


 外部変数名にexternを付けて宣言すれば,その変数を別のファイルでも使用することができる.ロボットやロケットなどの制御プログラムは,非常に長いものとなるので,複数人で分担してプログラムを開発する.その際,同一の変数をextern付きの外部変数として宣言する必要がある.(当計算機システムでは,externは省略可)

 下記のプログラム「file_1.c」と「file_2.c」を作成し,その動作を確認せよ.コンパイル方法は

  cc  file_1.c  file_2.c
となる.(教科書p.53の「文法6-4」の2.を参照)


  【file_1.c】
#include<stdio.h> int data; void func1(void); void func2(void); main() { data=1; printf("data= %d\n",data); func1(); printf("data= %d\n",data); func2(); printf("data= %d\n",data); func3(); func4(); } void func1(void) { ++data; } void func2(void) { --data; }

  【file_2.c】
#include<stdio.h> /* 関数printfを使用しているので必要 */ extern int data; void func3(void) { data+=2; printf("data= %d\n",data); } void func4(void) { data-=2; printf("data= %d\n",data); }

 【練習2】 1〜10の整数を順番に表示するが,偶数のときは,その値を2倍したものも併せて表示するプログラムのmain関数を以下に示す.

  main(void)
  {
   int i;
   for(i=1;i<=10;++i)
      {
       if(i%2==0)
          func_even();
       else
          func_odd();
      }
  }
【実行結果】
 1
 2 4
 3
 4 8
 5
 6 12
 7
 8 16
 9
 10 20

関数func_even(),func_odd()は,それぞれ,ex9_2_1.c,ex9_2_2.cの異なるファイルで定義され,上記のmain関数は,ex9_2_1.cで定義されるものとして,プログラムを作成せよ.
(ヒント:外部変数を用いる)

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)

6.2 関数の記憶クラス

 関数にも記憶クラスがあり,有効範囲を指定することができる.

6.2.1 static関数

 有効範囲は,その関数のあるファイル内であり,他のファイルで使用している関数名と同じ名前で別の内容の関数を定義することができる.これを関数の私有(プライベート)化と呼ぶ.

6.2.2 extern関数

 関数は,記憶クラスを指定しない場合(省略した場合)には,extern関数と見なされる.extern関数は,関数を記述したファイル以外の別ファイルでも使用することができる.

 下記のプログラム「file_3.c」と「file_4.c」を作成し,その動作を確認せよ.コンパイル方法は

  cc  file_3.c  file_4.c
となる.(教科書p.54の「文法6-5」と「文法6-6」を参照)


  【file_3.c】
#include<stdio.h> void func1(void); void func2(void); extern func3(void); /* この行は省略可能 */ main() { func1(); func3(); func2(); } void func1(void) { printf("Shimane "); } void func2(void) { printf("University\n"); }

  【file_4.c】
#include<stdio.h> /* 関数printfを使用しているので必要 */ static void func1(void); /* この行は省略可能 */ void func3(void); /* この行は省略可能 */ static void func1(void) { printf("\n"); } void func3(void) { func1(); printf(" "); }

 【練習3】 下記のプログラムを2つのファイル(ex9_3_1.c,ex9_3_2.c)に分割して実行できるようにせよ.ただし,関数func1〜func4をどのように分割するかは自由とする.

  #include<stdio.h>
  void func1(void);
  void func2(void);
  void func3(void);
  void func4(void);
  main(void)
  {
   func1();
   func2();
   func3();
   func4();
  }

  void func1(void)
  {
   printf("Shimane ");
  }

  void func2(void)
  {
   printf("University\n");
  }

  void func3(void)
  {
   printf(" s084099 ");
  }

  void func4(void)
  {
   printf("Shimadai Taro\n");
  }

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)

レポート課題8(授業終了後にアップロード)

 RePORTシステム