2008. 2.21.
石立 喬

Visual C++ 2008 Express Edition の易しい数値計算(1)

――― 最初はHello Worldから ―――

 最近、Microsoft社から「Visual C++ 2008 Express Edition」(以後、Express Editionは省略する)が無償でダウンロードできるようになった。これを機会に、「Visual C++ 2008」を始める人も多いであろう。すでに「Visual C++ 2005」を使用している人にも、ここで述べる内容は、そのまま役に立つと思われるので、利用していただきたい。

Visual C++ 2008で新しくなったところ
 最近のプログラミングの動向が、Web 2.0、Enterprise 2.0など、ネットワークを介しての情報交換とビジネス応用に向かっているのを反映して、「Visual C++ 2008」を含む「Visual Studio 2008」は、Webアプリケーションを作成し易いよう、「Windows Server 2008」、「SQL Server 2008」との連携を深めている。また、「Windows Vista」に即したWindowsフォーム作りが可能になり、統合開発環境の操作性が改善されている。
 しかし、これらは理工系の技術者や学生が学術的な用途で使用するには、ほとんど必要のないもので、無理して「Visual C++ 2008」に変更する必要はない。

プログラムで本当に重要なのは、入出力以外の処理部分
 従来の「Visual C++ 2005の易しい使い方」や「Visual C++ 2005の易しい画像処理」では、マウスを用いたデータ入力や処理の指示、画面上のグラフィック表示を用いた結果の出力を詳しく述べてきた。プログラムを使用するユーザの立場からは、これらは重要であり、市販ソフトを開発するプロのプログラマも、これらの設計に多くの時間を割く。
 しかし、GUI使用テクニックをある程度習得した後には、入出力以外の処理部分をより重点的に学ぶ必要がある。良いプログラムの作成に本当に重要なのはこの部分で、従来の説明では不十分であった。

ここでの「Visual C++ 2008」の取り上げ方
 多くの解説書や解説サイトでは、「コマンドプロンプト」ウインドウを使用するコンソールアプリケーションに関するものが多い。そして、そこではVisual C++ではなく標準C++であることが多い。これは、入門者向けに処理部分を中心に解説するには、コンソールアプリケーションの方が適しているからである。
 しかし、本格的なプログラムの作成やオブジェクト指向を学ぶには、標準C++では不十分である。そこで、将来への発展性を考え、より豊富なクラスライブラリを使用し、必要に応じてGUIも考慮できる、Visual C++を用いたコンソールアプリケーションを重点的に取り上げることにした。
 従来、「Visual C++ 2005」で説明してきたWindowsフォームアプリケーションと異なり、CLRコンソールアプリケーションは、入力をキーボードから行い、出力も「コマンドプロンプト」ウインドウ内に表示される。プリンタへの出力や、グラフィック表示はできない。しかし、.NET FrameworkとCLR(Common Language Runtime)を使用しているマネージ型であるので、すでに「Visual C++ 2005の使い方」などで習得した知識を応用すれば、Windowsフォームアプリケーションに変更するのは比較的容易である。

統合開発環境の使い方
◎プロジェクトの新規作成
1)「Microsoft Visual C++ 2008」を起動する(デスクトップからアイコンをダブル・クリックするなどして)。
2)「Visual C++ 2008」の「スタートページ」ウインドウが開く。
3)メニューから「ファイル」→「新規作成」→「プロジェクト」を選択する。
4)「新しいプロジェクト」ウインドウが開くので、
    プロジェクトの種類 ------ CLR
    テンプレート ------------ CLRコンソールアプリケーション
    プロジェクト名 ---------- (入力する)
    ソリューションのディレクトリの作成 ---- (チェックは付けない)
 として、「OK」をクリックする。
 図1は、「プロジェクト名」欄に「C800」(一例)と入力して、「OK」をクリックする直前の「新しいプロジェクト」ウインドウを示したものである(ただし、注意を引くために、「CLRコンソールアプリケーション」にフォーカスを当ててある)。


図1 「新しいプロジェクト」ウインドウの一例


 図1について若干の説明を加える。左の「プロジェクトの種類」欄で「CLR」を選ぶと、 .NET Frameworkを用いたマネージ型の中間言語コードを出力する。「Win32」を選ぶと、CPUを直接動作させるネイティブコードを出力することができるが、「Express Edition」では、Win32コンソールアプリケーションのみに限られる。「全般」を選ぶと、プログラムをコンパイルしリンクする手順を指定するmakeファイルを作成できるが、ここでは使用しない。
 図1の右の「テンプレート」欄は、左の「プロジェクトの種類」欄によって可能な選択肢が変わる。テンプレートとは型紙のことで、自動的に生成されるスケルトンの種類を意味する。

◎コードの記述
 「新しいプロジェクト」ウインドウで「OK」をクリックすると、「Visual C++ 2008 統合開発環境」のウインドウが開く。 図2は、その一部を示したもので、左側の「ソリューションエクスプローラ」部には「ソリューション’C800’」ができており、「ソースファイル」、「ヘッダーファイル」、「リソースファイル」の各フォルダとファイルができている。右側の「コードエディタ」部には、「C800.cpp」が表示されている。何らかの理由で表示されていないときは、「ソリューションエクスプローラ」で、「C800.cpp」をダブル・クリックする。
 「コードエディタ」部には、スケルトンのプログラムができていて、なぜだか、「Console::WriteLine(L”Hello World”);」が入っている。


図2 開いたばかり「Visual C++ 2008統合開発環境」の主要部


 図2について若干説明する。左の「ソリューションエクスプローラ」部には、ファイル構成が示されている。ファイル名をダブル・クリックすると、右の「コードエディタ」部に内容が表示される。
 図2の右の「コードエディタ」には、「C800.cpp」が表示されている。詳細は後述の「自動生成されたプログラムの説明」の項で説明する。

◎プログラムのビルド(コンパイルとリンク)
 1)メニューから、「ビルド」→「<プロジェクト名>のビルド」を選択する。
 2)「コードエディタ」の下部の「アウトプット」ウインドウにエラーや警告が表示されることがある。警告は、無視することができるが、エラーがある場合には、ビルドが完了せず、プログラムを実行させることができない。
 3)エラーや警告が表示された場合には、その理由を示す説明文(スクロール・アップされて見えない場合は、スクロール・ダウンする)の任意の場所にカーソルを持って行きダブル・クリックすると、「コードエディタ」の該当部分に矢印が表示される。
 4)修正して、再び「ビルド」→「<プロジェクト名>のビルド」を選択する。

◎プログラムの実行
 1)メニューから「デバッグ」→「デバッグなしで開始」を選択する。
 2)プログラムが実行される。図3は、プログラム実行時の画面で、「コマンドプロンプト」ウインドウが開き、プログラムの実行結果が示されている。


図3は、自動生成されたスケルトンプログラムの実行結果


◎プログラムの保存
 「ビルド」を行うと、自動的にプログラムが格納される。

自動生成されたスケルトンプログラムの説明
 stdafx.hは標準でインクルードされるヘッダーで、standard affix(標準添付物)の意味がある。個別に追加したいインクルードファイルがあれば、stdafx.hを開いてそこに記述しても良いが、<プロジェクト>.cppの#include “stdafx.h” の下に直接記述した方が確認に便利である。
 using namespace System; は、コンソール入出力に必要なConsoleクラスを含む名前空間Systemの指定である。
 main関数の引数には、array<System::String ^> ^argsと見慣れない表現があるが、これはStringクラスの配列args(argumentsの意)を意味する。このプログラムを「コマンドプロンプト」ウインドウから呼び出し、その際に引数を記述する場合には必要であるが、ここではそのような使用方法を採らないので、単にint main()としても差し支えない。
 “Hell World”の頭にLがついているのは、Unicodeであることを明示したもので、「Express Edition」の場合には、Unicodeしか扱えないので、Lが無くても差し支えない。
 return 0;は、このプログラムが正常に完了した場合には0の値を返すことを意味する。これにより異常発生をチェックすることができる。

コードエディタに行番号を付ける
 プログラムをデバッグする際には、エディタに行番号を付けておくと便利である。そのためには、下記の設定をする。
 1) 統合開発環境のメニューから、「ツール」→「オプション」を選択する。
 2) 「オプション」ウインドウで、「テキストエディタ」→「すべての言語」→「全般」を選択する。
 3) 右の「表示」欄の「行番号」にチェックをつけ「OK」をクリックする。
 コードの印刷時に行番号を含めたい場合には、
 1) 「ファイル」→「印刷」を選択する。
 2) 「印刷対象」欄で「行番号を入れる」にチェックを付け、「OK」をクリックする。

スケルトンを書き換えて作った最初のプログラムと実行結果
 int mainの引数を消し、Console::WriteLine(L”Hello World”);を消してから、図4のようにプログラムを記述した。意味についてはコメントを参照されたい。


図4 最初のプログラム


 これをビルドし、実行して得られたのが図5である。


図5 最初のプログラムを実行して得られた画面


従来のプログラムとの比較
 参考までに、上述の最初のプログラムとまったく同じ結果が得られるプログラムを、従来の言語で記述し、動作させた。いずれも、「Visual C++ 2008」の環境を使用して作成し、確認することができる。

 下記は標準のC++言語で記述したもので、これならば分かりやすい人も多いのではないかと思われる。

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int main()
{
   string string1,string2;
   cout<<"姓を入力して下さい:";
   cin>>string1;
   cout<<"名を入力して下さい:";
   cin>>string2;
   cout<<"姓名は:"<< string1<<" "<<string2<<endl;
   return 0;
}

 下記は標準のC言語で記述したもので、これも周知の方が多いと思われる。scanfの使用は好ましくなく、scanf_sを使うようにビルド時に警告されたが、古いままにしてある。scanf_sはバッファーサイズを指定するので、それ以上の不正な入力をエラーにできる、より安全な(_sはsecureの意)関数である。

#include "stdafx.h"
#include <stdio.h>

int main()
{
   char string1[20], string2[20];
   printf("姓を入力して下さい:");
   scanf(" %s",string1);
   printf("名を入力して下さい:");
   scanf(" %s",string2);
   printf("姓名は:%s %s \n",&string1,&string2);
   return 0;
}

 標準C言語と標準C++言語を比較すると、やはり大きな違いがある。ここで採り上げた .NET Frameworkによるマネージ型C++は、さらに違いがある。したがって、C言語の経験があるからと言って、極めて容易に「Visual C++ 2008」を使用できるとは限らない。しかし、上記の例でも分かるように、「Visual C++ 2008」はマネージ型C++の中に標準Cや標準C++を混在させることもできるので、従来の経験が全く無駄になることはない。


「Visual C++ の勉強部屋」(目次)へ