2000年11月13日更新(外部変数のみでの関数とのデータ渡しでの不便さを追加)
  関谷トップページへ アプリケーション演習トップページへ 作者へのメッセージ

アプリケーション演習No.13 C言語プログラミング 4-2 外部変数, 4-3 静的変数

  2000.09.01 KPC 情報技術科 関谷

1.4-2 外部変数, 4-3 静的変数への補足

付録A 文法の総まとめ(A-7-2 記憶クラスp.134-136)の参照

 このテキストでは、本文とは別に、付録A 文法の総まとめがある。ここには、体系的により詳しい記述もあるので、参照のこと。このページへは、巻末の索引を見れば、記述してあるページが分かる。(本文と付録と2つでているので、後の方)

VC++の「MSDNライブラリ」で文法の詳細を見る

VC++6.0を起動してソースリスト上で選択した用語・関数・予約語などの詳細は、F1キーを押して(あるいは、スタート-プログラム-Microsoft Developer Network-MSDNライブラリで直接起動)、MSDNライブリを参照すると良い。
(c言語関係)から、キーワードで「関数」の部分を引用すると次のようになっている。
関数
関数は C の基本モジュール単位です。関数は通常、特定のタスクを実行するように設計されます。また関数にはそのタスクを反映する名前を付けることがよくあります。関数は宣言とステートメントから成ります。この章では、C の関数の宣言方法、定義方法、呼び出し方法について説明します。またこの章では次のトピックについても説明します。

関数の概要
関数の属性 
呼び出し規約の指定 
インライン関数
DLL インポートおよびエクスポート関数
naked 関数
記憶クラス
戻り値の型
引数
パラメータ 

Webページの参照

ヤフーでの検索結果を以下に示す。 スコープ 静的変数 外部変数 をキーワードに検索した結果3件のページが見つかりました。
 このうち、次の2つが今回の内容と同じページでした。参照のこと。
・第29章
第29章 変数のスコープおよびクラス 第15章、第21章であとから 「変数とスコープ」のところで解説するように書きましたので、今回はその解説をします。 (忘れていなかった) もう、何回もサンプルプログラム...
http://www.kumei.ne.jp/c_lang/intro/no_29.htm

・情報処理 II − 第10回
情報処理 II − 第10回 講義に入る前に shori2 にカレントディレクトリを移しておいてください。 1.記憶クラス 1.1.自動変数 ブロック内で定義された変数は、 その変数定義のところで生成(メモリ割り当てや...
http://www.sys.wakayama-u.ac.jp/%7Etokoi/lecture/shori2/10.html

 なお、小生の情報処理技術者試験とC言語入門−関連リンクに、ヤフーの「コンピュータとインターネット/プログラミング言語 /C_and_C__/」を追加したので、これも参照のこと。

2.今日の実習 4-2 外部変数, 4-3 静的変数,演習問題

4-2 外部変数

 外部変数は、関数の外で宣言される。外部変数を使えば、引数にしないで、各関数が参照できる。しかし、関数の独立性が損なわれるし、変数の安全性も良くないので、普通は使わないのが良い。
 引数にしないときの欠点例:同じ関数を使って、異なる変数(配列でも同じ)の処理をしたいとき、引数で渡すのなら、実引数のところにその変数名を書くだけで良い。引数にしないで外部変数を使っている場合、その外部変数に代入してから、関数を呼ばなくてはならない。値を受け取る場合なら、戻ってからの代入が必要になる。

 プログラム 4-4 引数のない関数で1行分の文字列を読み込む

 1行目の#define LMAX 100については、定数の「1行の最大文字数」をマクロで定義している。3行目の配列のサイズ、19行目の反復の上限の2箇所で使っているが、このマクロ定義の1行目の文を変更するだけで良い。それに数値でなく、文字列なので意味を表せる。なお、詳しくは、4-6 プリプロセサで解説してある。

 ANSIでの関数の使い方は、以下のようになる。
 まず、プロトタイプ宣言をしておく。2 void getln(void);
 実引数で、関数を呼ぶ。        10     getln();
 関数の定義を仮引数で行う。    14 void getln(void){

 (注)プロトタイプ宣言の目的は、関数呼び出しのチェックをできるようにすること。
戻り値、引数の型と順序をコンパイル時にコンパイラが調べて、警告を出す。
戻り値、引数がないときは、それぞれvoid型とする。
上のgetln()は両方ともないので、void getln(void);としている。

 プログラミング実習では、C言語のプログラムの様式に合わせて作成のこと。なお、考察を先頭部分に書くのが良い。

 例題4-2 英小文字の文字列を読み込み、暗号文を作る

 3 char st[LMAX];をvc++6.0のコマンドラインでの普通のコンパイルでは、実行すると正しい結果が得られない文字がある。理由は、符号付の演算のために、127を超えるとマイナスになってしまうためである。
 unsigned char 型(0〜255)に変更すれば、正しい結果になる。

4-3 静的変数

 静的変数は、関数から出ても値が保持される。

プログラム 4-5 文字列を入力して、文字種を調べ、関数の呼び出し回数も数える

 プロトタイプ宣言は、つぎのようになる。
   void getstr(void);	// 戻り値なし、引数なし
   int alnum(int c);	// 戻り値は整数型、引数は整数型が1つ

 例題4-3 英小文字の文字列を読み込み、表を引いて、暗号文を作る

 このプログラムは、暗号化と復号化と両方に使えるアルゴリズムである。

 プロトタイプ宣言は、つぎのようになる。
   void getstr(void);
   void xcode(void);

4章の演習問題 5), 6), 7), 8)

4-5) 外部変数のテスト

4-6) 外部変数のテスト int x,y; での入替えの関数

 前述したように、外部変数を使うことは勧められない。しかし、戻り値では2つの値を返すことが出来ない。ポインタをまだ学習していないために、これを使わざるを得ない。

4-7) 配列を使っての入替え関数

 配列であれば、関数内での入替えが、呼び出し側にも反映される。しかし、この演習問題も、学習のためであろう。普通は、次章のポインタを使ってのデータの受け渡しを行う。

4-8) 外部変数を使わない2つの整数の入替え関数とmain

 外部変数を使わないために,関数のみでは交換できない。そのためmain()で、和・差を計算して、整数の交換を行っている。あくまで、学習用であろうが。

3.レポート

3.1 レポート用ファイルの作成

 レポートは、実習した全部のプログラムを順番に貼り付けて、レポート用のテキストファイルを作成のこと。

3.2 提出フォルダとファイル名

・フォルダ:w:\アプリケーション演習¥C言語scope9.1
・ファイル名:nn氏名ap13.txt