◆◆◆◆アマゾンで購入する◆◆◆

15.色々な便利な方法 
           内    容
(1)領域サイズが固定的でないとき
(2)マクロの定義
(3)動的領域の確保
(4)コマンドラインや環境変数
(5)今後


(1)領域サイズが固定的でないとき

たとえば,以下のように
配列宣言されているものとしましょう。

    int intArea[100];
    double dblArea[100];

いま,これらの配列が同じサイズの領域だとします。

これらのサイズを100から200に変更するとき,
「100」と書かれた2箇所を
「200」に変更しなければなりません。

一方,マクロ定義を使って,

  #define MAXAREA 100

  int intArea[MAXAREA];
  double dblArea[MAXAREA];

としておくと,
マクロ定義部分だけを変更すれば構いません。

(2)マクロの定義

ソースプログラムのある範囲が同じ形をとるとき,
マクロを使うと便利です。

たとえば,以下のように定義して,

#define swap(type,x,y)do{type t;t=x;x=y;y=t;}while(0)

次のようにソースプログラム中に記述します。

 swap(int A, B);

すると,次のように記述されたものとみなされます。

  do {int t; t = A; A=B; B=t;} while(0)

関数の呼び出しに似ていますが,
ソースプログラム中に展開されますので,
関数呼出しのオーバヘッドがないので,
高速になります。

ただし,

 #define swap(type, x,y){type t; t=x; x=y; y=t;}

と定義すると,

 if(C1) swap(int, A, B);
 else  swap(int, A, C);

を展開したとき,

if(C1) { int t; t=A; A=B; B=t; };
else  { int t; t=A; A=C; C=t; };

となりエラーとなります。このエラーをなくすためには,

 if(C1) swap(int, A, B)
 else  swap(int, A, C)

と記述せざるをえませんが,Cのスタイルではありません。

最初の上記定義だと,

if(C1) do{ int t; t= a; a=b; b=t; }while(0);
else  do{ int t; t= a; a=c; c=t; }while(0);

となりエラーとなりません。

このように工夫する必要があります。

(3)動的領域の確保

たとえば,以下のように,mallocを使って,
実行時に領域を確保することができます。

 int *area;
  ・
  ・
  ・
 area = (int *) malloc(sizeof(int)*num);

この方法を使うと,
サイズを実行時に決めることができ,
マクロを使う方法に対して,
コンパイルしなおす必要がありません。

どのようにアドレスが確保されるかについては,
以下のプログラムを実行して,
アドレス値を確認してみましょう。

[確認用プログラム]
#include "stdafx.h”
#include <cstdlib> /* mallocを使うときは,これをinclude */
int main(int argc, char* argv[])
{
 int i,num,int *area;
 printf("\n\n領域サイズ:");
 scanf("%d",&num);
 while(num>1)
 {
  area=(int *) malloc(sizeof(int)*num);
  for(i=0;i<num;i++)area[i]=i;
  printf("\n\nPointer= %p",area);
  printf("\n\n Value %d",area[0]);
  for(i=1;i<num;i++)printf(", %d",area[i]);
  printf("\n\n領域サイズ:");
  scanf("%d",&num);
 }
}  

(4)コマンドラインや環境変数

main関数に引数を記述すると
コマンドラインで指定された引数や
環境変数等を取り出すことができます。

本来は,
コマンドライン上で,例えば,

 A>実行形式名 引数1 引数2

などとコマンドライン上で引数を
空白で区切って実行したときの情報を
取り出すのですが,デバッグ時は,
プログラミング環境下で作業しますので,
これをデバッグ時の引数を指定します。

このためには,以下のように操作します。






次のようなプログラムを作って,
コマンドラインの引数,環境情報を取り出すことが
できるかどうかを確認しましょう。

[確認用プログラム]
#include "stdafx.h"
int main(int argc, char* argv[], char *env[])
{
 int i;
 /* コマンドライン引数,環境変数等*/
 printf("\nNumber of Argment=%d",argc);
 for(i=0;i<argc;i++)
  { printf("\n Arg[%d]=%s",i,argv[i]); }
 for(i=0;i<3;i++)
  { printf("\n Environment[%d]=%s",i,env[0]); }
  return 0;
}

(5)今後

老婆心ながら,今後の方向性について
私の意見をまとめてみましたので
参考にしていただければ幸いです。

ただし,これはあくまで,参考意見ですので,
とらわれることはありません。

プログラミングは,やはり手馴れ,耳慣れ,目慣れ。
色々と試してみましょう。
 
ただ,長続きするためには,
自分にとって面白いテーマを選んで,
「遊ぶ」ことが大事です。
 
裸のCの勉強だったので,
「コンソールアプリケーション」を 選択しましたが,
「Windowsフォームアプリケーション」を選択して
色々なプログラムを作成してみましょう。

ただ,このときはVisual C++6ではなく,
Visual C++.Netを使うことをお勧めします。
GUIの定義が非常に便利になっていますので,
プログラミングそのものに集中できます。
 
グラフィックやゲームプログラミング等にも
挑戦してみましょう。
 
ゲームソフトを遊びのソフトと馬鹿にするなかれ。
色々なテクニックの集積ともいえますので,
テクニックを学ぶには非常に役にたちます。

さらに,実行すると楽しいので長続きし,
プログラミング慣れするためにはお勧めです。
 1.C言語の誕生

 2.C言語の仲間たち

 3.新しい言語をすばやく覚えるには

 4.Cでプログラミング

 5.データの入れ物 変数の考え方

 6.注釈・定数

 7.プログラムの実行順序

 8.配列

 9.C言語特有の代入文・制御構造

10.関数の話

11.構造体と共用体

12.ビット演算

13.プログラムの場所をポインタで

14.ファイルの入出力

15.色々な便利な方法