(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.色々な便利な方法
|