「言語とプログラミング」受講者へ

例年,「課題のプログムを自分のパソコンで作れませんか?」という質問を受けますので,回答をここにまとめておきます.方法は幾つかありますので,自分に適した方法でやってみてください.全て無料で可能です.

いずれの方法も,基本的にはgccと呼ばれるフリーのコンパイラを利用するものですが,以下では,最も利用者が多いと思われるWindows PC上にC言語の開発環境を構築する方法について説明していきます.
教科書の第11章に掲載されている,グラフィックス処理を行う環境構築についても以下で解説していますが,こちらはWindows環境のみに対応しています.

目次

  1. Windows PCにMingWをインストールする
    1. MinGWをダウンロードする
    2. MinGWをインストールする
  2. Windowsの環境変数を設定する
  3. 動作確認する
  4. グラフィックス環境について
    1. ライブラリ・ソースファイルのダウンロード
    2. ライブラリの作成
    3. 動作確認
    4. グラフィックス処理を含むプログラムの作成について
    5. 教科書第11章,p.165,例11.2のサンプルプログラム(正弦波の表示)を動作させてみる
    6. 色の指定とモノクロ(グレースケール)について
    7. 教科書第11章,p.168,例題11.1のプログラム(画像の表示)を動作させてみる

 

1. Windows PCにMingWをインストールする

MinGWとは,GNUの開発環境を使ってWindows 上でアプリケーション・プログラムを開発できるツールの集まりです.以下では,MinGWのインストールとテスト実行の手順を説明します.2013年6月時点での最新版をインストールしたときの情報を元に作成していますので,リンクの位置や細かい文言は変わっている可能性があります.どうしても分からない場合は担当者(久保)まで質問してください.

なお,以下のインストール・実行の確認は,Windows7(64bit版)で行いました.32bit版や,XP等でも問題なく動くと思います.

1.1 MinGWをダウンロードする

1.MinGWのダウンロードページを表示する
MinGWの情報はhttp://www.mingw.org/にあります.このページを表示すると左下の方に「Download」のリンクがあるのでクリックしてください.

 

2.MinGWのインストール用実行ファイルをダウンロードする

「Download mingw-get-inst-XXXXXXXX.exe」クリックしてしばらくするとダウンロードが始まります.分かりやすい場所に保存してください.

 

1.2 MinGWをインストールする

  1. ダウンロードしたファイルを実行します.セキュリティの警告が出ることがありますが「はい」でOKです.
    実行すると,ダイアログが出てきて色々と聞かれますので,答えていきます.
    Welcome.....の画面.「Next」をクリック.


  2. 管理者権限でインストールしていることの確認.自分のPCにインストールしている状況で,この意味が分からなければスルーでOKです.
    「Next」をクリック.


  3. リポジトリ・カタログの確認.
    最新版を入れておけば良いので,「Download latest .......」を選択して「Next」をクリック


  4. ライセンス条項の確認.よく読んで,同意できる場合のみ「I accept ....」にチェックを入れて「Next」をクリック.
    当然,同意しないと次に進めません(^^;;


  5. インストールするディレクトリの選択
    デフォルトでは「C:\MinGW」になっています.特に変更する必要はありません.「Next」をクリック.


  6. スタートメニューに登録するか否かの選択です.お好みで選んで「Next」をクリック.


  7. インストールするコンポーネントを指定.
    BLAS や LAPACK などを使いたいと考えているならば,「Fortran Compiler」も選んでおく必要があります.また,教科書の第11章にある「グラフィクス」関連の機能を試してみたい人は「MSYS Basic System」,「MinGW Developer Toolkit」が必要になることもあります.
    全部選んでも大した容量にならないので,全部選んでおきましょう.


  8. インストールの確認です.良ければ「Next」をクリックしてください.


  9. インストール完了の画面が出れば無事終了です.ダウンロードしながらインストールするので,しばらく時間がかかります.
    「Finish」を押して終わりです.

 

2. Windowsの環境変数を設定する

  1. 以上で,「C:\MinGW」の中に各種のファイルがインストールされました.コンパイラなどは「C:\MinGW\bin」の中に入っています.
    中身を覗いてみてください.色々ありますが,Cコンパイラは「gcc」,C++コンパイラは「g++」という名前です.
  2. これらのコンパイラをコマンドラインから呼び出すために,Windowsのコマンドサーチパスに「C:\MinGW\bin」を加えます.

  3. マイコンピュータを右クリックし,プロパティを表示させ,「システムの詳細設定」をクリックします


  4. 「システムのプロパティ」が表示されるので,「環境変数」をクリックします.


  5. 「環境変数」が表示されるので,システム環境変数の中から「Path」を探し,「編集」をクリックします.


  6. 編集可能な状態になりますので,変数値に「C:\MinGW\bin」を加えます.エントリの区切り文字は「;」セミコロンです.
    追加したら「OK」を押して,全てのウィンドウを閉じます.


    以上で設定は完了です.

 

3. 動作確認する

エディタで以下のようなプログラムを作成する.
「C:\MinGW\test.c」に保存されているとして説明する.

 
   #include<stdio.h>

   int main(void){
       printf("%d\n",5+3);
       return 0;
   }

 

コマンドウィンドでコンパイルして,実行してみる.
コマンドウィンドの起ち上げは,スタートメニューの「プログラムとファイルの検索」に「cmd」と打ち込んでEnter.

または,ソースコードの保存されているフォルダで,「Shift+右クリック」し「コマンドウィンドウをここで開く」を選択する.
カレントディレクトリを操作する手間(以下のコマンド操作)が省ける.

カレントディレクトリをソースコードが保存されている場所に変更する.
ディレクトリの移動は「cd」コマンドで行う.この辺りはUNIX系のコマンドと似ている
ドライブを変更する場合は「ドライブレター」に「:(コロン)」を付けてエンター.



コンパイルは「gcc test.c」.コンパイルがエラー無く終了すると,「a.exe」 という実行ファイルが生成されるので,これを起動する.



4. グラフィックス処理の環境について

「言語とプログラミング」の授業では取り上げないのですが,教科書の第11章にグラフィックス処理の内容があります.この章の主な意図は,「C言語の簡単なプログラミングでこんなこともできる(た)」ということを知って貰うことにあります.

「こんなこともできる(た)」という微妙な表現を使ったのには,以下のような理由があります.

その昔,windowsが出始める頃までは,グラフィックスをPC上で扱うのは大変面倒なことでした.そのため各種開発環境の発売元は , グラフィックスを簡単に扱うことができるライブラリを独自機能として整備し,抱き合わせて発売していました.この辺りは,時代が変わっても同じような状況かと思います.「C言語」といっても,様々な開発環境が,様々なベンダから提供されています.実をいうと,教科書の第11章で紹介している描画のための各種関数は,Borlandという会社が出していたTurbo Cという開発環境で提供されていたものです.

さて,その後Windowsが主流になりどうなったかというと,描画に関する基本機能はOS(windows)により提供されるようになりました.PCの性能も飛躍的に向上し,複雑な画像処理,動画処理も簡単にできるのはご存じの通りです.その反面,ソフトウェアは複雑化し,グラフィックスを扱うソフトウェアを作ろうと思うと,C++言語などを利用して,Windowsと連携したプログラミングを行う必要がでてきました.

要するに,教科書第11章のサンプルプログラムを作成してもそのままでは動きません.動かそうとすると,使用しているPC,OS,コンパイラ等に依存した開発環境の整備が必要になり,一般的に「こうすれば良い」ということが難しいのが現実です.そのため,「動かなくても良いから描画の基本的な考え方を紹介する」というのが当初のコンセプトでした.

しかしながらこの教科書の出版後,学生の皆さんから「教科書に載っているグラフィックスを試してみたいがどうすれば良いか?」という質問がたくさん出てきました.大学や専門学校の先生方からも,「この本のグラフィックス環境は何を使っているのか?」という質問をよく頂いています.また,海外でも,過去のプログラム資産を有効に活用したいと考えている方や,大学などでの導入教育のため,昔ながらの,簡単な,C言語でのグラフィック処理環境に対する需要があるようです.

そこで,上でインストールしたMinGWの環境下で,教科書第11章で説明した「graphics.h」で定義されている各種関数を使う方法を紹介しておきたいと思います.環境の構築には,米国,コロラド大学で開発された「WinBGIm」というライブラリを使用させて頂きます.利用に当たっては開発元のライセンス条項にしたがってください.

なお,以下で紹介する方法は,筆者が環境構築を行った際の作業をメモしたものです.作業に関してお気づきの点などありましたらご連絡頂ければ幸いです.使用した環境は,Windows7, 64bit版,MinGW(gcc4.7.2),WinBGIm 6.0(Nov 2005)です.
(基本的には,windowsでgccとg++が利用できれば,同じような方法が使えると思いますが,個々の環境に応じたご質問にはお応えしかねます)

 

4.1 ライブラリ・ソースファイルのダウンロード

WinBGImの開発元は「ここ」になります.ライブラリと,そのソースへのリンクがあります.gccのバージョン等の関係で,そのままでは動きませんでしたので,ソースファイルから構築を行います.ソースファイルをダウンロードしてください.

4.2 ライブラリの作成

  1. ヘッダファイルの修正
    ダウンロードしたファイルを解凍すると,18個のファイル群が現れます.このままコンパイルすると,「winbgim.h」と「graphics.h」の302行目("right"の定義)でエラーが出ますので,修正を加えます.両ファイルをテキストエディタで開き,302行目の左側の「right」を「top」に修正して保存します.
    【誤】int left=0, int right=0, int right=INT_MAX, int bottom=INT_MAX,
    【正】int left=0, int top=0, int right=INT_MAX, int bottom=INT_MAX,

  2. makeする
    ソースファイル群に含まれているmakefileを用いて,makeします.
    mekeコマンドは,「C:\MinGW\msys/1.0/bin」にありますので,このディレクトリを環境変数Pathに加えておきます.方法は上記「Windowsの環境変数を設定する」を参考にしてください.

    ソースファイル群のあるディレクトリをカレントディレクトリにして,「make」コマンドを実行します.ワーニングが出るかも知れませんが,エラーで無ければ取り敢えず無視します.処理が終わると,10個ほどファイルが増えていると思います. 「winbgim.h」,「graphics.h」,「libbgi.a」の3つのファイルを探して,以下のようにコピーすれば完了です.
    • 「winbgim.h」と「graphics.h」を「C:\MingW\include」にコピー
    • 「libbgi.a」を「C:\MinGW\lib」にコピー

4.3 動作確認

以下のサンプルプログラムをコンパイルしてみます.c++として認識させる必要がありますので,ソースプログラムの拡張子を"cpp"とします.ここではファイル名を「test.cpp」としておきます.

 
#include<stdio.h>
#include<graphics.h>

int main( )
{
    initwindow(400, 300, "First Sample");
    circle(100, 50, 40);
    while (!kbhit( )){
        delay(200);
    }
    return 0;
}

コンパイル時に「libbgi.a」,「libgdi32.a」,「libcomdlg32.a」,「libuuid.a」,「liboleaut32.a」,「libole32.a」をリンクする必要があります.コマンドは以下のようになります.

 
g++ test.cpp -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

 

実行して,下のような画面(円を描いたウィンドウ)が出ればOKです.



4.4 グラフィックス処理を含むプログラムの作成について

WinBGImでは,DOS上で動いていたgraphics.hの関数(Borland Graphics Interfaceで提供されていた機能)の多くがエミュレートされています.またWindows向けに新たに追加された機能もあります.関数一覧が以下のリンクにありますので参考にしてください.
Borland Graphics Interface (BGI) for Windows

 

4.5 教科書第11章,p.165,例11.2のサンプルプログラム(正弦波の表示)を動作させてみる

上で紹介した環境を用いて,教科書(基礎から学ぶCプログラミング )第11章のプログラムが動作することを確認してみましょう(一部修正が必要になります.また,色指定の方法に若干癖があります.まずは,例11.2のプログラムを動作させてみます).

【p.165,例11.2のプログラム】
正弦波の波形を描くプログラムです.原稿作成時の手違いで,変数"color"が定義されておらず,このままではエラーになります.以下の8行目のように,変数"color"を宣言して値を設定して下さい.また,このままでは,描画が終了した時点でプログラムも終了してしまい,描画された内容を確認することができません.任意のキーが押されるまで待機させるために,27行目のように"getch( )"を挿入して下さい(ソースファイルはこちら).

 
     // rei11-2.cpp 
  1: #include<stdio.h>
  2: #include<graphics.h>
  3: #include<math.h>
  4: 
  5: int  main(void){
  6: 
  7:     int  x,y;
  8:     int color=1;
  9: 
 10:     int graphdriver=DETECT,graphmode,i;
 11:     initgraph( &graphdriver,&graphmode,"");
 12:     if (color==0) {for(i=0;i<16;i++) setrgbpalette(i,i,i,i);}
 13: 
 14:     setbkcolor(0);
 15:     setcolor(15);
 16: 
 17:     line(0,200,630,200);
 18:     line(50,100,50,300);
 19: 
 20:     moveto(50,200);
 21: 
 22:     for(x=0;x<360;x++){
 23:         y=(int)(100.0*sin(2.0*3.14/360.0*(double)x));
 24:         lineto(x+50,y+200);
 25:     }
 26: 
 27:     getch();
 28: 
 29:     closegraph( );
 30:     return(0);
 31: }

 

"math.h"を使っていますので,コンパイル時に"-lm"オプションが必要かも知れません.コンパイルはつぎのようなコマンドになります.
  g++ rei11-2.cpp -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32 -lm
実行結果は以下の通りです.ワーニングが出ますが取り敢えず無視します.

 

4.6 色の指定とモノクロ(グレースケール)について

描画色の変更

【p.165,例11.2のプログラム】で背景色と,ライン色を変えてみます
BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE の16色はgraphics.hで定義されており色の指定に使えます.これを使って,背景色を青色,正弦波プロットと軸の色を赤色に設定してみます. そのため,
14行目のようにsetbkcolorの引数をBLUE
15行目のようにsetcolorの引数をRED
とします.ただし,WinBGImの解説(Borland Graphics Interface (BGI) for Windows)に記載されているように,setbkcolorで背景色を指定した後,背景が描画された時点でその色指定が反映されますので,
16行目のようにcleardevice( )
を呼び出して一旦描画をクリアすることで背景色を塗り替える必要があります.

 
  1: #include<stdio.h>
  2: #include<graphics.h>
  3: #include<math.h>
  4: 
  5: int  main(void){
  6: 
  7:     int  x,y;
  8:     int color=1;
  9: 
 10:     int graphdriver=DETECT,graphmode,i;
 11:     initgraph( &graphdriver,&graphmode,"");
 12:     if (color==0) {for(i=0;i<16;i++) setrgbpalette(i,i,i,i);}
 13: 
 14:     setbkcolor(BLUE);
 15:     setcolor(RED);
 16:     cleardevice( );
 17: 
 18:     line(0,200,630,200);
 19:     line(50,100,50,300);
 20: 
 21:     moveto(50,200);
 22: 
 23:     for(x=0;x<360;x++){
 24:         y=(int)(100.0*sin(2.0*3.14/360.0*(double)x));
 25:         lineto(x+50,y+200);
 26:     }
 27: 
 28:     getch();
 29: 
 30:     closegraph( );
 31:     return(0);
 32: }
        
実行例は以下の通りです.



グレースケールの取り扱い

例えば上のプログラムでは,変数colorを0に設定した場合,12行目で16階調のグレースケールに応じたパレットを作成して描画することになります(教科書161~163ページを参照).ただし,WinBGImを利用する環境の場合,予想通りの結果が得られません(原因は現在調査中です).回避策を以下に示しておきます.

カラーバーを表示する以下のようなプログラムを考えます(ソースファイルはこちら).17行目で塗りのパターンと色(16色)を指定しています.

 
     //bar.cpp
  1: #include 
  2: #include 
  3: 
  4: int main(void)
  5: {
  6: 
  7:    int graphdriver=DETECT,graphmode;
  8:    int i, ht, y, xmax;
  9: 
 10:    initgraph( &graphdriver,&graphmode,"");
 11: 
 12:    ht = getmaxy() / 16;
 13:    xmax = getmaxx();
 14:    y = 0;
 15: 
 16:    for (i=0; i<16; i++) {
 17:        setfillstyle(SOLID_FILL, i);
 18:        bar(0, y, xmax, y+ht);
 19:        y += ht;
 20:    }
 21:    getch();
 22:    closegraph();
 23:    return 0;
 24: }
        

実行結果は以下のようになります.

このプログラムを,グレースケール表示するように変更してみます.例11.2や例題11.1のプログラムでは,"setrgbpalette"関数を用いてグレースケール用のパレットを作成しています.しかし現在のところ,筆者の環境下ではこの関数の動作が確認できていません.代替策として,以下の17行目のように"COLOR"関数を用いて直接色指定を行うことでグレースケールの表示が可能でした.

 
  1: #include 
  2: #include 
  3: 
  4: int main(void)
  5: {
  6: 
  7:    int graphdriver=DETECT,graphmode;
  8:    int i, ht, y, xmax;
  9: 
 10:    initgraph( &graphdriver,&graphmode,"");
 11: 
 12:    ht = getmaxy() / 16;
 13:    xmax = getmaxx();
 14:    y = 0;
 15: 
 16:    for (i=0; i<16; i++) {
 17:        setfillstyle(SOLID_FILL, COLOR(i*16,i*16,i*16));
 18:        bar(0, y, xmax, y+ht);
 19:        y += ht;
 20:    }
 21:    getch();
 22:    closegraph();
 23:    return 0;
 24: }
        

実行結果は以下のとおりです.

 

4.7 教科書第11章,p.168,例題11.1のプログラム(画像の表示)を動作させてみる

【p.168,例題11.1のプログラム】
画像データをグレースケールで表示するプログラムです.上に示したカラー指定,グレースケールの実現方法を参考にして,プログラムを修正します.下の左側が教科書に収録したプログラム,右側が修正例です.変更箇所は以下の通りです.
 ・上12行目:変数"i"を2重に宣言していたので,削除
 ・上14行目:上で示したように,"setrgbpalette"がうまく動作しないので削除
 ・下18行目:"setrgbpalette"の代わりに"COLOR"でグレースケールを直接指定
 ・下22行目:キーが押されるまで待機するため"getch()"を挿入

修正版のソースファイルと確認用画像データはこちら).

 
     // 例題11.1(教科書オリジナル) 
  1: #include<stdio.h>
  2: #include<graphics.h>
  3: 
  4: int main(void){
  5: 
  6:     FILE  *fp;
  7:     unsigned char data[640];
  8:     int i,j;
  9:     
 10:     fp=fopen(“c:\\gazou”,”rb”);
 11: 
 12:     int graphdriver=DETECT,graphmode,i;
 13:     initgraph( &graphdriver,&graphmode,"");
 14:     if (color==0) {for(i=0;i<16;i++) setrgbpalette(i,i,i,i);}
 15: 
 16:     for(i=0;i<400;i++){
 17:         fread(data,sizeof(unsigned char),640,fp);
 18:         for(j=0;j<640;j++){
 19:             putpixel(j,i,data[j]/16);
 20:         }
 21:     }    
 22:     fclose(fp);
 23:     closegraph( );
 24:     return(0);
 25: }
        
 
     //reidai11-1.cpp(修正版)
  1: #include<stdio.h>
  2: #include<graphics.h>
  3: 
  4: int main(void){
  5: 
  6:     FILE  *fp;
  7:     unsigned char data[640];
  8:     int i,j;
  9:     
 10:     fp=fopen(“c:\\gazou”,”rb”);
 11: 
 12:     int graphdriver=DETECT,graphmode;
 13:     initgraph( &graphdriver,&graphmode,"");
 14:     
 15:     for(i=0;i<400;i++){
 16:         fread(data,sizeof(unsigned char),640,fp);
 17:         for(j=0;j<640;j++){
 18:             putpixel(j,i,COLOR(data[j], data[j], data[j]));
 19:         }
 20:     }    
 21:     fclose(fp);
 22:     getch( );
 23:     closegraph( );
 24:     return(0);
 25: }
        


このプログラムでは,Cドライブ直下にある"gazou"というファイルを読みに行きますので,適切な場所にファイルを置くか,10行目のファイルへのパスを自分の環境に合うように変更して下さい.実行結果は以下のようになります.