最初の一歩
はじめに
ごあいさつ
皆さん、こんにちは。今号から1年間、計12回、「C言語入門」を連載させていただきます、長久(ながく)と申します。
本誌を購読されておられる方々は、既にご理解されていると思いますが、今やプログラミング言語といえば、真っ先に「C言語」が挙げられる時代になっています。当然、プログラミングを習得しようという場合に、最初に候補に挙がるプログラミング言語にもなっています。現に、大学や専門学校などで教えられているプログラミング言語の筆頭になっていますし、学生の方の中には、毎日C言語と格闘の日々を送っておられる方も多い事でしょう。
本連載では、これからC言語の習得を目指す人や、一通りやってみたけどイマイチ分からなかった人を対象に、なるべく噛み砕いた内容を目指したいと考えています。勉強している時、教科書を読んでも分からなかったけど、友達に教えてもらったら分かったって事がよくありますよね。友達に教えてもらう時のようにはいかないと思いますが、教科書と友達の中間あたりを目指して、筆を進めていきたいと思います。
最初のC言語が設計された年に生まれた私が、C言語と出会ってちょうど10年目になりますが、「やっと少しは分かってきたかなあ」という程度です。一昔前は、現役でプログラミングを出来るのは、せいぜい30代までと言われたりしていましたが、実際には40代で現役の方もたくさんおられます。ですから、ゆっくり、気長に勉強してもらえば良いと思います。プログラミングは実学と捉えるのが一般的な見方なので、すぐにでも習得して、すぐにでも現場でやっていかなければならないと考えがちですが、表層部分の知識を詰め込んで吐き出すだけではなく、その根底にある哲学に触れたり、ものを作る事を楽しんだりという部分にも目を向けてもらえれば、違ったものが見れるようになると思います。少なくとも、ボケ防止には有効かと(^^;
ともあれ、C言語の世界へようこそ。連載計画
本連載は、計12回ありますが、前半6回、後半6回に分けて進めていきます。
前半6回は入門編として、C言語の文法に関する解説を行います。具体的には、以下のような構成を予定しています。第1回「最初の一歩」
各種環境下での「Hello,World.」までを解説。第2回「データを扱う」
各種データ型、配列、構造体を中心に解説。第3回「演算を行う」
算術、論理演算に付いて解説。第4回「手続きの流れを制御する」
制御構文について解説。第5回「関数を使う」
関数を使う、関数を作るの両面に関して解説。第6回「ポインタを使う」
ポインタとは何か、C言語の立場から解説。後半6回は実践編として、C言語を使って各種ソフトウェアを作成する事例を扱います。ソート、ビン詰め、ファイル変換、言語処理系などを予定しています。
「教科書と友達の中間あたりを目指」す為に、皆さんの意見を可能な限り反映させた内容となるよう努力したいと思いますので、「C言語入門 ML」(コラム参照)にご意見をお寄せ下さい。よろしくお願いします。
開発環境を使う
本章の目的
現在、C言語は、最も標準的なプログラミング言語になっています。この為、様々なOS、プラットフォーム上でC言語を利用する事が可能です。つまり、UNIX(Linux)上でも、Windows上でも、Mac上でも、C言語を使ってソフトウェアを開発する事が可能なのです。また、1つのOSに対して、使用出来るC言語開発環境が複数存在するのが普通で、例えばWindows上で使えるものを思い浮かべるだけでも、Microsoft Visual C++(以下、MSVC++)、Borland C++ Builder(以下、BCB)、LSI C-86、CodeWarrior(以下、CW)、Watcom C/C++、DJGPPなどの名前を挙げる事ができるほどです。
本連載では、「ANSI-C」というC言語の標準規格の枠内でプログラミングする事を前提にします。現在使用されているようなC言語開発環境では、ほとんど全てのC言語開発環境が、この標準規格に準拠していることをうたっています。従って、本連載の内容は、ほとんど全てのC言語開発環境において有効になります。しかし、「ANSI-C」は言語仕様を定めてはいますが、開発環境に関連する仕様を定めているわけではありませんから、C言語開発環境は千差万別なのです。C言語でプログラムを書けても、C言語開発環境を扱えなければ、実際には開発できません。日本語を知っていても、ワープロの使い方を知らなければ、きれいに印刷された書類を作成できませんね。
従って、ここでは、代表的なOS上での、代表的なC言語開発環境の使用方法をまとめてみます。C言語開発環境は持っているけど使い方が分からない、学校のUNIX上の環境では使えるけど家のWindows上でどうすれば分からない、といった場合に、マニュアルと格闘する前に読んでいただければよいと思います。プログラミングの為の準備
コンピュータ上では、様々なデータがファイルと呼ばれる形で扱われますので、プログラミングについての勉強を始める前に、コンピュータ上での各種操作に不自由しない程度に、ファイルシステムに関する理解や、各種操作、コマンドを習得しておく必要があります。特に、はじめてプログラミングを始めようという人で、Windows上でやろうとされている方は、マウスによる一般的な操作の他に、DOS窓上での操作を習得するようにして下さい。(コラム「CUI」参照)List.1:hello.c
#include <stdio.h>
int main()
{
printf("hello,world.\n");
return 0;
}
C言語開発環境では、ソースファイル(List.1参照)と呼ばれるC言語で書かれたテキストファイルを作成し、そのファイルをコンパイラと呼ばれるソフトウェアで実行形式ファイルに変換します。この変換作業をコンパイルと呼びます。こうして得られた実行形式ファイルは、その名の通り、対象となるOS、プラットフォーム上で実行する事が可能となっています。つまり、実行形式ファイルがプログラミングの結果、生成されるソフトウェアになるわけです。
どのC言語開発環境においても、このような手続きを経るのは同じなのですが、その手続きを意味する操作が環境毎に異なるのです。ここでは、個々の開発環境について述べる前に、C言語開発環境を使う前の準備として、C言語開発環境の種類に依存しない、最初にやっておくべき準備を行う事にします。
まず、ワーク用のディレクトリを用意します。ディレクトリはOSによってはフォルダーとも呼ばれています。ワーク用とはどういう意味かというと、プログラミング時に作成される各種ファイルをまとめて格納しておく為のディレクトリという意味です。作成するソフトウェア毎にディレクトリを用意して、関連のないファイルが紛れ込んだり、必要なファイルが失われたりしないように管理するわけです。WindowsやMacを使ってる人で、なんでもかんでも取り敢えずデスクトップに置いている人がいると思いますが、それではファイルの管理なんて出来ませんよね。次に、ワーク用ディレクトリにソースファイルを作成する為に、テキストエディタを用意して下さい。用意といっても、大抵のOSには、最初から付いているテキストエディタがありますので、それを使えるようになるだけでよいです。Windowsならメモ帳(notepad)が付いていますね。
演習:作成したワークディレクトリに、ファイルの内容が、list.1である"hello.c"というファイルを作成せよ。
それでは、代表的なOS、開発環境毎に、作成した"hello.c"を実行形式ファイルにしてみましょう。
UNIX上でのC言語開発環境
UNIXでは、WindowsやMacと違い、Cコンパイラ(C言語開発環境)が最初から使用出来るのが標準的な構成になっています。追加投資なしにC言語開発環境が手に入るので、まさにプログラマ向けのOSといえるでしょう。一般的には、2種類のCコンパイラが使用出来る場合が多いです。その2つとは、「cc」と「gcc」です。実際には、「gcc」を「cc」として使えるように設定している環境も多いと思いますが、初心者にとってはどちらも同じだと思って下さい。ここでは、「cc」を使う事にします。
「cc」を使って、"hello.c"から、実行形式ファイル"hello"を作成する為には、以下のコマンドを実行します。$ cc -o hello hello.c
実行後、ディレクトリ内のファイルを見てみると、"hello"ができているのが確認できると思います。「cc」がもし動作せず、"hello"が作成されない場合は、
$ gcc -o hello hello.c
を実行してみて下さい。
ここで作成された"hello"は実行形式ですので、コマンド同様に実行できます。つまり、$ hello
hello,world."hello"を実行すると、「hello,world.」と表示されます。"hello"が実行できなかった場合は、
$ ./hello
を実行してみて下さい。
演習:"hello.c"から実行形式"hello"を作成し、動作を確認せよ。
"hello.c"から「cc」を使って「hello,world.」と表示するソフトウェア"hello"が作成出来る事を理解して頂けたでしょうか?
Windows上でのC言語開発環境
Windows上には「MS-DOS プロンプト」もしくは「コマンド プロンプト」という、通称「DOS窓」と呼ばれるソフトウェアが付属しています。このDOS窓は、GUIベースのOSであるWindows上で、CUI環境を提供するものです。まず最初に「DOS窓」に関して準備する事にしましょう。
DOS窓を[スタートメニュー]からメニューをたどって起動すると、当然ながらカレントディレクトリが、作成したワークディレクトリではありません。そこで、ワークディレクトリにDOS窓のショートカットを作成し、開発時に使用する事にします。例えば、Windows98であれば、[スタートメニュー]-[プログラム]の[DOS窓]の上で、右マウスクリックでメニューを表示しコピーを行い(Fig.3参照)、ワークディレクトリに貼り付ける事が出来ます。ワークディレクトリに作成した、ショートカットのプロパティをいじる事で、DOS窓起動時の設定を行う事ができます。特にここでは、起動時のカレントディレクトリを、ショートカットのあるディレクトリにする為に、[プロパティ]-[プログラム]-[作業ディレクトリ(実行時のディレクトリ)]の記述を削除します。
こうして準備したDOS窓上で、コンパイルと実行を行う事になります。LSI C-86 Ver 3.30 試食版 を使う
エル・エス・アイ ジャパン社がFreewareとして提供しているCコンパイラ(C言語開発環境)が、LSI C-86 Ver 3.30 試食版(以下、LSI-C)です。製品版のサブセットになっていますが、プログラミング入門者にとっては十分な機能を有しています。
このCコンパイラを使用する為には、エル・エス・アイ ジャパン社のHPから"lsic330c.lzh"をDL、解凍し、HDD上に配置します。ここでは、D:\に[lsic330c]を置く事にします。以下の説明はそれを前提として続ける事になります。付属のドキュメント類、特に使用条件などには必ず目を通すようにして下さい。
次に、Cコンパイラの実行環境を設定する為に、"lsic330c\bin\_lcc"を編集します。先ほどのHDDへの配置位置から、"_lcc"をlist.2のように変更します。要は、BIN、LIB、INCLUDE各ディレクトリが、どこにあるのかという情報を記述するわけです。List.2:_lcc
# LSI C-86 compiler's configuration file
-DLSI_C
#-XA:\LSIC86\BIN -LA:\LSIC86\LIB -IA:\LSIC86\INCLUDE -T -O
-XD:\LSIC330C\BIN -LD:\LSIC330C\LIB -ID:\LSIC330C\INCLUDE -T -O
-acdos.obj $LSICOPTS
& #Command line argument will be inserted here
-lknjlib -ldoslib -v
Cコンパイラの準備の次は、作業環境の設定を行います。ワークディレクトリにlist.3の内容をもった"lsic.bat"を作成して下さい。作成したら、DOS窓のプロパティを開き、[プロパティ]-[プログラム]-[バッチファイル]の所に、"lsic.bat"を記述して下さい。
List.3:lsic.bat
path %path%;d:\lsic330c\bin
この設定によって、DOS窓からLSI-Cを使用できるようになります。また、この設定後、DOS窓起動時に、「環境変数のための領域が足りません.」とメッセージが表示されるようになるかも知れません。この場合は、[プロパティ]-[メモリ]-[環境変数の初期サイズ]を、自動ではなく、1024程度の値に変更して下さい。
この値は、DOS窓起動時に、「環境変数のための領域が足りません.」のメッセージがでない、最小の値に設定するように調節して下さい。
準備が終わったら、DOS窓を起動して、LSI-Cを使って、"hello.c"から、実行形式ファイル"hello.exe"を作成してみます。以下のコマンドを実行してください。> lcc hello.c
実行後、ディレクトリ内のファイルを見てみると、"hello.exe"ができているのが確認できると思います。
ここで作成された"hello.exe"は実行形式ですので、コマンド同様に実行できます。つまり、> hello
hello,world."hello.exe"を実行すると、「hello,world.」と表示されます。
演習:"hello.c"から実行形式"hello.exe"を作成し、動作を確認せよ。
"hello.c"からLSI-Cを使って「hello,world.」と表示するソフトウェア"hello.exe"が作成出来る事を理解して頂けたでしょうか?
Microsoft Visual C++ を使う
マイクロソフト社のMSVC++は、OSメーカーの言語製品である事もあり、Windows上では最もポピュラーなC言語開発環境として使われています。ここでは、MSVC++をDOS窓から利用する方法について解説します。
MSVC++には、コマンドライン(DOS窓)での使用時に、作業環境を設定する為のツール(バッチファイル)が付属しています。これをワークディレクトリにコピーします。MSVC++のインストールされているディレクトリ(デフォルトでは C:\Program Files\DevStudio\Vc)のbinディレクトリにある"vcvars32.bat"をワークディレクトリにコピーして下さい。
もしあなたがMSVC++5.0を使おうとしているのなら、コピー後、"vcvars32.bat"を編集し、「set vcsource=E:\DEVSTUDIO」(「E:\DEVSTUDIO」の部分は、環境によって異なる)と書かれた行を、「rem set vcsource=E:\DEVSTUDIO」として下さい。この変更を行わない場合、MSVC++をインストールした時に使用したCD-ROMドライブに、MSVC++のCD-ROMを入れておかないと、バッチファイル実行時に、「準備ができていません. 読み取り中 ドライブ E: 中止 (A), 再試行 (R), 失敗 (F)?」のように、メッセージが出てしまいます。
次に、DOS窓のプロパティを開き、[プロパティ]-[プログラム]-[バッチファイル]の所に、"vcvars32.bat"を記述(Fig.5参照)して下さい。この設定によって、DOS窓からMSVC++を使用できるようになります。また、この設定後、DOS窓起動時に、「環境変数のための領域が足りません.」とメッセージが表示されるようになるかも知れません。この場合は、[プロパティ]-[メモリ]-[環境変数の初期サイズ]を、自動ではなく、1024程度の値に変更(Fig.6参照)して下さい。この値は、DOS窓起動時に、「環境変数のための領域が足りません.」のメッセージがでない、最小の値に設定するように調節して下さい。
準備が終わったら、DOS窓を起動して、MSVC++を使って、"hello.c"から、実行形式ファイル"hello.exe"を作成してみます。以下のコマンドを実行してください。> cl hello.c
実行後、ディレクトリ内のファイルを見てみると、"hello.exe"ができているのが確認できると思います。
ここで作成された"hello.exe"は実行形式ですので、コマンド同様に実行できます。つまり、> hello
hello,world."hello.exe"を実行すると、「hello,world.」と表示されます。
演習:"hello.c"から実行形式"hello.exe"を作成し、動作を確認せよ。
"hello.c"からMSVC++を使って「hello,world.」と表示するソフトウェア"hello.exe"が作成出来る事を理解して頂けたでしょうか?
Borland C++ Builder を使う
ボーランド社のBCBは、IDEの使いやすさ、VCLと呼ばれる独自ライブラリ、Delphiとの連携、などの特徴を持つC言語開発環境です。ここでは、BCBをDOS窓から利用する方法について解説します。
BCBの場合は、インストール時に、コマンドライン(DOS窓)で使用出来るように自動的に設定されますので、LSI-CやMSVC++のような設定を行う必要はありません。DOS窓を起動し、BCBを使って、"hello.c"から、実行形式ファイル"hello.exe"を作成してみましょう。以下のコマンドを実行してください。> bcc32 hello.c
実行後、ディレクトリ内のファイルを見てみると、"hello.exe"ができているのが確認できると思います。
ここで作成された"hello.exe"は実行形式ですので、コマンド同様に実行できます。つまり、> hello
hello,world."hello.exe"を実行すると、「hello,world.」と表示されます。
演習:"hello.c"から実行形式"hello.exe"を作成し、動作を確認せよ。
"hello.c"からBCBを使って「hello,world.」と表示するソフトウェア"hello.exe"が作成出来る事を理解して頂けたでしょうか?
設定さえしてやれば、全く同様にボーランド社のフリーのC/C++コンパイラBCCも使えます。Mac上で CodeWarrior を使う
メトロワークス社のCWは、マルチプラットフォーム、マルチターゲットの開発環境で、特にMac上のC言語開発環境としては、もっともポピュラーなものです。
MacにはCUIが用意されていないので、CWを先に述べたMSVC++やBCBのような方法で利用する事は出来ません。本連載では基本的にCUI上でのプログラミング作業を扱いますが、かといってMacを無視するのも乱暴だと思われましたので、CWの簡単な使用方法について解説を行う事にしました。しかし、特に連載後半において、Mac上では行えない操作などを扱う場合もある事をご了承下さい。
それでは、"hello.c"をCWでコンパイル、実行する手順を解説します。
CWを起動させたら、まず、[ファイル]-[新規]-[プロジェクト]から、「MacOS C/C++ ステーショナリ」を選択し、プロジェクト名に「hello」、場所に作成しておいたワークディレクトリを指定します。続いて、プロジェクトのひな型を選択する事になりますので、ここでは「Standard Console - Std C Console 68K」を選択して下さい。
すると、プロジェクトの内容を表示するウィンドウが現れます。ここで「Sources」にデフォルトで"HelloWorld.c"が登録されていますので、これを削除し、ワークディレクトリに作っておいた"hello.c"を登録します。
以上の作業の後、ツールバーでコンパイル&実行を行えば、実行形式"hello.out"がワークディレクトリに作成され、実行されます。
演習:"hello.c"から実行形式"hello.out"を作成し、動作を確認せよ。
"hello.c"からCWを使って「hello,world.」と表示するソフトウェア"hello.out"が作成出来る事を理解して頂けたでしょうか?
まとめ
さて、皆さんそれぞれのマシンで、コンパイル、実行は無事に行えたでしょうか? とにかく、本章の内容を実践できなければ、C言語の勉強といっても、机上の空論になってしまいます。次回以降では、「コンパイル実行して下さい」の一文で済まされてしまいますので……演習:"wellcome.c"をコンパイルし、動作を確認せよ。
List.4:wellcome.c
#include <stdio.h>
int main()
{
printf("wellcome to C world.\n");
return 0;
}
本章の内容を一言でまとめると、
「ソースファイルをコンパイルすると、実行形式ファイルが作成される。」
となります。
コラム
C言語入門 ML
本連載に関する、ご質問、ご希望、ご意見を迅速に処理する為に、ML(メーリングリスト)をご用意致しました。皆さんの声を反映して、連載の方を進めていきたいと思っていますので、是非ご利用ください。
MLに参加する為には、
start_c-subscribe@egroups.co.jp
宛てに、中身が空のメールを出して下さい。引き続いて、参加確認の返信が送られてきますので、そのメールに返信してMLに参加となります。
また、過去ログが
http://www.egroups.co.jp/group/start_c/
にて参照できますので、合わせてご利用ください。
なお、本MLの運営自体は、筆者(長久 勝)が個人的に行うものであり、ソフトバンク パブリッシング(株)「Cマガジン」編集部とは一切関係ありませんので、編集部に対してMLの問い合わせを行わないようにして下さい。
※2002/8現在、上記MLは事実上休眠状態です。ANSI-C
現在、様々なプラットフォーム上で、分野を問わず、ソフトウェア開発に使用されているC言語ですが、多くの人が使っているのには理由があります。
そもそもC言語は、UNIXを開発する過程で生まれました。1972年に Dennis M.Ritchie が最初のコンパイラ実装を行った時、その目的は、OSを記述できる能力を持ったプログラミング言語を作る事でした。UNIXの開発者達は、UNIX上のCコンパイラで、UNIX自身を作成できる環境を整える事で、異なるハードウェア構成のコンピュータにUNIXを移植するのを容易にしました。その後、UNIXが世界中に普及する事になり、その立役者の一人であるC言語も広く使われる様になったのです。C言語の最も本質的な特徴は、「OSが書けるぐらいに、何でも出来る」という点です。この為、C言語が使えれば、分野を問わず様々なソフトウェアを作成できるのです。
C言語が広まるに従って、様々な人々が様々な修正、拡張を行いました。この為、80年代に入る頃には、C言語の「方言」が問題視されるようになりました。この頃には、C言語で書いたソースなら、どこへ持っていってもコンパイルして実行出来るという認識が生まれつつあったからです。そこでアメリカの規格委員会 ANSI(The American National Standards Institute、日本のJISの様な組織)によって、1983年から1988年にわたって、C言語の標準化が進められました。ここで生まれたC言語の仕様は「ANSI-C」と呼ばれ、以降作成されるCコンパイラのほとんどが、この仕様を満たすように作成される事になりました。この結果、C言語は、「ANSI-C準拠Cコンパイラのある環境であれば、極めて高い移植性が保証される」言語になったのです。
現在では既にUNIXの枠を飛び越えて活躍するC言語ですが、ここで述べたような歴史と利点を押えておく事で、理解の一助になれば幸いです。CUI
現在のパーソナルユースOSの主流はGUI(Guraphical User Interface)ベースのWindows、Macです。しかし、そもそもGUIとは、コンピュータの操作をユーザーフレンドリーにする為に導入されているもので、アプリケーションソフトウェアを使う圧倒的多数のユーザーの為の操作系なのです。
WindowsやMacの一般的なアプリケーションでは、文字入力を除く全ての操作をマウスで行えますが、これはキーボードよりも直感的なマウスで操作させる事によって、初心者にとっつき易いようにしてあるわけです。そうして慣れてくると、マウスでの操作における効率の悪さが問題になるので、キーボードによるショートカットを併用して作業効率を改善できるようになっています。
しかし、キーボードを両手で操作するような場合には、右手がマウスとキーボードの間を往復するので、作業効率と操作感に問題が生じる事になります。何故なら、プログラミング作業の中心的な作業は、両手でキーボードを叩き、ソースコードを作成する事だからです。
また、ソフトウェア制作時に必要になる各種ツール(ファイルの変換プログラムなど)に関しても、GUI上では各種ツールを組み合わせて使いたい場合に不便です。GUI上のほとんどのソフトウェアで、連携して自動的に処理を行う事が出来ません。ほとんど同じ機能を持ったソフトウェアを、2、3種同時に使用する事になった経験はないでしょうか?
最近ではGUIを前提としたIDE(Integrated Development Environments、統合開発環境)が開発環境の主流となりつつありますが、IDE上で全てのプログラミング作業を行えるわけではありません。実際のプログラミングは、IDE上で書くソースコードをコンパイルするだけで終わるほど単純ではないのです。例えば、別のプログラムで生成されたデータをソースコードの一部として利用したりする事がありますが、IDE上で簡単にそうした事が可能であるとは言えない状況なのです。
このようにGUIは、ソフトウェア制作者にとっては必ずしも適した操作系とは言えません。ではどのような操作系が良いのでしょうか? 上に挙げたような問題点を持たない操作系として、GUI全盛以前に採用されていたCUI(Character User Interface)を挙げる事が出来ます。
CUIとは、UNIX上(Xwindow上のterm)で
$ ls
を実行したり、Windows上の「MS-DOS プロンプト」もしくは「コマンド プロンプト」で
> dir
を実行したりするような、キーボードからコマンドを打ち込む事でコンピュータを使う操作系です。
本連載では、なるべく実践的な内容にする為にも、CUI上での開発を考えます。
UNIX上では、CUIを使う事が一般的なので、使用方法やコマンドを解説した書籍が沢山あります。内容がまとまっていて手頃な書籍として、例えば、舟本奨、『実用UNIXハンドブック』、ナツメ社、本体価格2,240円(税別)、ISBN4-8163-1654-X
があります。
Windows上では、CUIであるDOS窓を使う事が、あまり一般的ではないので、使用法やDOSコマンドを解説した書籍が、最近ではあまり見かけないようになってしまいました。古本屋で探せば、そうした内容の書籍を、安く入手できるかも知れません。最近刊行されたDOSについて書かれた本としては、米田聡、『WindowsユーザーのためのDOS/コマンドプロンプト入門』、ソフトバンクパブリッシング、本体価格1,800円(税別)、ISBN4-7973-2043-5
Web上でこうした内容に相当するものとして、
があります。
Macにおいては、OS自体にCUIが用意されていません。従って、個人的には、開発者向けでないプラットフォームに思えます。但し最近では、Mac上でWindowsエミュレーションを行うソフトウェアが市販されていますので、このエミュレータ上でCUIを使用して開発を行う事が可能です。また、次期バージョン「MacOS X」では、WindowsのDOS窓のような、CUIが搭載されるようです。
次回は「データを扱う」です。次回から本格的にC言語の文法を学んで行きましょう。それでは。
参考文献
B.W.カーニハン & D.M.リッチー(石田晴久訳)、『プログラミング言語C』、共立出版、本体価格2,800円(税別)、ISBN4-320-02692-6協力
松本 勝