石原高のオレ流C++独学塾 - 第1回 オレ流Hello World

By: Hitoshi Fujii

Abstract: 現場を離れてから今またプログラミングに興味を持った中間管理職 石原 高。独学でC++にチャレンジするが、果たしてオレ流が通用するか?

Hide image
ishihara

「おまえはもうコードを書くな」と上司にいわれてはや3年。管理職業務も板についてきた今日この頃だが、オレ的には、やはり手がうずく。軽快にコードを入力してEnterキーのストロークを決めたい。

ものの記事によると、今組み込み市場がホットで、CやC++の需要が高まっているらしい。N88 BASICでプログラミングを始めて、仕事じゃFORTRANやCを使ってきたオレとしては、最近の言語はどうもなじまない。どうせオブジェクト指向やるなら、オレ流としては風呂釜にJavaじゃなくてC++だろう。管理職のオレ様としては、背中は窓でうしろに立つものはいないし、こっそり残業してC++でも始めてみるか。


    環境を準備する

まずは、C++コンパイラだ。ネットサーフィンをすると、Borland C++Compilerというのが無料でダウンロードできるらしい。これだ!何事にも投資は必要だが、まずは状況を見極めることが重要だ。早速ダウンロードしてみよう。

ダウンロードページにアクセスしてみて分かったが、今、ボーランドの開発ツールは、CodeGearというところが出しているらしい。CodeGearはボーランドの開発ツール部門だそうだ。よく分からないが、いろいろ情報も揃っているようなので、ダウンロードしてみよう。

C++Compilerというのは、コマンドラインコンパイラだ。今時の若いもんは、MS-DOSなんて知らないかもしれないが、昔はみんな黒い画面でちまちま作業をしたもんだ。Windowsの世界では、[スタート]メニューから[プログラム|アクセサリ|コマンドプロンプト]で作業する。DOS窓ってやつだ。

インストールは至って簡単だ。ダウンロードしたインストーラを実行するだけだ。

ところで、ダウンロードするときに気になっていたのだが、C++Builder 2007っていうのは、Windows Vistaにも対応した新しいC++の開発環境らしい。トライアル版もあるので、とりあえず調査を兼ねてこれもダウンロードしておこう。

C++Builder 2007だけど、どうもサイズが小さいと思ったら、ダウンロードしたのはインストーラだけらしい。インストール作業をしながら必要なファイルをダウンロードしてくるようだ。なるほど、今はやりのネットワークインストールってやつだな。トライアル版の使用期限が30日ってのがちょっと気になるが、ひょっとすると三日坊主になるかもしれないし、オレ的にはコマンドラインコンパイラがメインなので十分すぎる長さだ。

こいつのインストールは結構大変だった。インストーラは親切だが、インストールするファイルが膨大だ。ネットワークインストールのせいもあってか、1時間以上かかってしまった。まったく今時の開発環境は困ったもんだ。

Hide image
01fig_1

図1 C++Builder 2007のインストール

途中Serial Numberを入れるところがあって気がついたが、インストーラのダウンロードとは別にキーも発行しておかなければならなかったのだ。オレ様としたことが。ダウンロードページに戻って、キーを発行する。

「CodeGear 製品登録」という件名のメールでキーが送られてきた。

Hide image
01fig_2

図2 Serial Numberの発行

    C++Compilerで最初のプログラム

C++Compilerを使うには、いろいろトラディショナルな環境設定作業を行わなければならない。オレ様としてはアドレナリンの出るところだが、今時の若いもんは、こういう作業に慣れているのだろうか。

まず、PATHの設定だ。昔は、autoexec.batをいじったもんだが、今は、[スタート]メニューから、[設定|コントロールパネル]で[システム]を選択する。「システムのプロパティ」ダイアログの[詳細設定]ページで[環境設定]ボタンをクリックする。

Hide image
01fig_3

図3 システムのプロパティ

環境変数ダイアログでは、個人環境のPATHに設定するか、システム環境のPATHに設定するのか悩むところだが、まあ、共通の設定ということで、システム環境変数の方に設定することにしよう。「変数」項目から「Path」を探して[編集]ボタンをクリック。表示されたダイアログボックスの[変数値]項目に、c:\borland\bcc55\bin を追加する。なんで、c:\borland\bcc55\bin かって?オレ様は、C++Compilerをc:\borland\bcc55にインストールしたのだ。bin というのは、そのコンパイラがあるディレクトリだ。ここにPATHを通しておけば、DOS窓から使えるのだよ。

Hide image
01fig_4

図4 システム変数の編集

しかし、PATHの長さに対して、この入力ボックスのサイズはないよな。

もうひとつやっておかなければならないのが、bcc32.cfgとilink32.cfgの作成だ。まず、c:\borland\bcc55\bin にbcc32.cfg という名前のファイルを作って、以下の内容を入力する。

-I"c:\borland\bcc55\include"
-L"c:\borland\bcc55\lib"

昔ならedlinやcopy conコマンドでファイルを作ったもんだが、今はメモ帳がある。不本意だが、メモ帳を開いて入力しよう。ilink32.cfgも同じ場所に作る。内容はこんな感じだ。

-L"c:\borland\bcc55\lib"

なぜオレ様がこんな情報を知っているかというと、readme.txtを読んでいるからだ。このファイルは、c:\borland\bcc55 にある。Web上の製品情報っていうのは古くて使えないけど、こういう設定情報は、一読しておくのがツウってもんだ。

Web上の情報ってのは、CDNにいっぱいあるようだ。C++Compilerについても、Borland C++ Compiler 5.5 – FAQっていう記事を見つけた。とりあえず、ここにあった簡単なC++のソースを入力してみよう。

オレ的にはDOS窓で作業をしたい。

[プログラム|アクセサリ|コマンドプロンプト]を選択してDOS窓を表示してからは、オレ様の世界だ。

Hide image
01fig_5

図5 コマンドプロンプト

まず、作業ディレクトリを作ろう。

Hide image
01fig_6

図6 作業ディレクトリの作成

エディタだが、たいした量のコードを打たないので、メモ帳で済ますことにしよう。だが、オレ的には、コマンドで起動したい。

Hide image
01fig_7

図7 notepad hello.cpp

どうだ。hello.cpp を作成してメモ帳で開けたろう。

さっきの記事から拝借してコードを入力してみる。printfのオレ様としては、よく分からない呪文だ。

#include <iostream.h>
main()
{
    cout << "Hello, World!" << endl;
    return 0;
}

ファイルを保存して終了したら、愛着あるDOS窓に戻って、次のようにコマンドを入力する。

Hide image
01fig_8

図8 bcc32 hello.cpp

おかしなことをしていなければ、コンパイルが成功するはずだ。「成功だ」とかいわないこの静けさがオレは好きだ。

さあ、できあがったプログラムを実行してみよう。

Hide image
01fig_9

図9 hello

うーん。知的な仕事をした感じだ。やはり技術者はこうでなくてはならない。

    C++Builder 2007も使ってみる

折角時間をかけてインストールしたのだから、C++Builder 2007も使ってみようと思う。ビジュアル環境の起動は、C++Compilerのようにはサクッといかない。でも、コーヒーを入れる時間があるほどモッサリともしていなかった。

Hide image
01fig_10

図10 C++Builder 2007

[ファイル|新規作成]で、作成できるファイルを確認する。「VCLフォームアプリケーション」というのが、うわさのビジュアルアプリケーションだな。オレ様のコンソールアプリケーションはどこだ?[その他]を選んでみよう。

Hide image
01fig_11

図11 [新規作成|その他]メニュー

[その他]を選んだら、「新規作成」ダイアログボックスが表示された。おぅ、あるじゃないか。オレ様が愛するコンソールアプリケーションが新規作成メニューに、最初っから表示されないってのは失礼な話だが、カスタマイズメニューを使えば追加できるようだ。世の中はGUIアプリ全盛なのだろう。これぐらいは許してやろう。

Hide image
01fig_12

図12 新規作成

「新規作成」ダイアログボックスで[コンソールアプリケーション]を選んで、[OK]ボタンをクリックすると、「新規コンソールアプリケーション」ダイアログボックスが表示される。コードはオレ様が打ち込むのだからさっさとエディタを表示してもらいたいが、ぐっとこらえて設定をしよう。

Hide image
01fig_13

図13 新規コンソールアプリケーション

[ソースの種類]はC++だ。VCLは使わない、マルチスレッドでもない。[コンソールアプリケーション]だけしっかりチェックだ。

[OK]ボタンをクリックすると、図のようにコードエディタが表示された。

Hide image
01fig_14

図14 コードエディタ

ちょろいコードだが、いくつか自動生成されている。hdrstopってなんだよ。オレ様をなめるなよ。#pragma がプリプロセッサ命令だということぐらい知っている。コンパイラによって違う命令を指定するのに使うんだよな。

ヘルプの説明によると、#pragma hdrstopを書くと、そこでプリコンパイルの対象となるヘッダファイルのリストが終わりってことになるらしい。C++は、なんとか.hっていうヘッダファイルがあって、毎回コンパイルしていると時間の無駄だろ。だから、プリコンパイルヘッダっていうのを使うのだ。先にコンパイルしてあるから早いってことよ。

よし、じゃあ、オレ様が使うiostream.hも#pragma hdrstopの前に書いてやろうじゃないか。

//---------------------------------------------------------------------------

#include <iostream.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    cout << "Hello, World!" << endl;

     return 0;
}
//---------------------------------------------------------------------------

さて、ここまで書いて気がついたが、まだこのソースファイルに名前も付けていなかった。C++Builderは勝手にFile1.cppなんて命名してやがる。失礼千万だ。

[ファイル|すべて保存]で全部名前をつける。File1.cpp はhello.cpp、プロジェクトの名前もhello.cbprojにしよう。

Hide image
01fig_15

図15 ファイルの保存

次に、コンパイル、実行。[実行|実行]メニューを選ぶ。ショートカットキーは[F9]だ。ツウは、いちいちメニューなんて使わないものだ。

Hide image
01fig_16

図16 実行

あれ、実行してもすぐに終わってしまう。結果も見れないぞ。

そうか、コンソールアプリケーションは、実行するとすぐ終了しちまうもんな。よし、最後の行の return 0; にカーソルを置いて、[実行|カーソル位置まで実行]を使ってみよう。

Hide image
01fig_17

図17 カーソル位置まで実行

よーし、今度は大丈夫だ。ちゃんとDOS窓に「Hello, World!」と表示された。

    オレ流Hello World!

しかしC++Builderで開発を始めたんだから、うわさのVCLアプリケーションてやつも使ってみないといけないだろう。[ファイル|すべて閉じる]で、helloアプリケーションとはおさらば。再び[ファイル|新規作成]で今度は、[VCLフォームアプリケーション – C++Builder]を選択する。

Hide image
01fig_18

図18 VCLフォームアプリケーション

おぅ、なかなかやるな。真ん中に表示されたフォームに、右のツールパレットにあるコンポーネントをドラッグ&ドロップしてユーザーインターフェイスを設計するそうだ。オレ的には、ソースコードがどうなっているのか気になるところだ。

Windowアプリのmain関数であるWinMainのあるアプリケーションソースは、Project1.cppのようだ。また、勝手に名前をつけやがって。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
     try
     {
           Application->Initialize();
           SetApplicationMainFormOnTaskBar(Application, true);
           Application->CreateForm(__classid(TForm1), &Form1);
           Application->Run();
     }
     catch (Exception &exception)
     {
           Application->ShowException(&exception);
     }
     catch (...)
     {
           try
           {
                 throw Exception("");
           }
           catch (Exception &exception)
           {
                 Application->ShowException(&exception);
           }
     }
     return 0;
}
//---------------------------------------------------------------------------

Application->CreateFormってところがミソだな。TForm1を作って実行しているわけだ。オレ様は、TForm1を作ればいいんだな。まあ、あとは…うん、今日はこのぐらいにしてやろう。

Unit1.cpp に戻って、こいつのソースコードも見てやろう。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
     : TForm(Owner)
{
}
//---------------------------------------------------------------------------

おぅ、ここにTForm1が定義されているな。Unit1.hも重要じゃないか。

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private:    // User declarations
public:           // User declarations
     __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

オレ様は、すでに画面右上のプロジェクトマネージャを使いこなしている。ファイルがリストされているから、そいつをダブルクリックすればいいだけだ。

さて、それじゃあフォームの設計でもしてやるか。Unit1.cppを表示したら、画面真ん中下の[デザイン]をクリックする。これで最初の画面に戻れた。

なんてったってまずは入力ボックスだろう。テキストの入力はビジネスアプリケーションには必須の項目だ。テキストを入力させれば、可変のメッセージだって表示できる。

ツールパレットの[Standard]から「TEdit」を選択して、ダブルクリックすれば、勝手にフォームに配置されるようだが、ドラッグ&ドロップでもいい。適当なところに配置してやろう。

Hide image
01fig_19

図19 TEditの配置

あとはボタンだ。これをクリックしたら、メッセージを表示するという風に作ってやろう。「TButton」を選択して配置する。

Hide image
Click to see full-sized image

図20 TButtonの配置

オレ的には、ここでソースコードに何が起こっているのか気になるところだ。画面中央下の[Unit1.h]をクリックして、ヘッダファイルを表示してみよう。

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
    TEdit *Edit1;
    TButton *Button1;
private:    // User declarations
public:           // User declarations
     __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

なるほど。Edit1とButton1がTForm1のメンバーとして定義されたってことだな。

よし、オレ的には、UIのデザインはとりあえずどうでもいいから、Edit1とButton1を使って、Hello Wolrdしてやろうじゃないか。

再び[デザイン]タブをクリックして、設計画面に戻る。設計フォームのButton1を選択すると、左下のオブジェクトインスペクタにButton1のプロパティが表示される。ボタンのラベルは正直なんでもいい。「Click」とでもしておこう。Captionプロパティが「Button1」になっているので、これを「Click」に変える。

Hide image
01fig_21

図22 ButtonのCaptionプロパティの設定

入力ボックスに最初からEdit1なんて入っているのは野暮だ。こいつも設計フォームで選択してから、オブジェクトインスペクタのTextプロパティで修正する。テキストは全部消してしまって、空の文字列にしてしまおう。

Hide image
01fig_22

図22 EditのTextプロパティの設定

ところで、プロパティの名前が分かっていて設定したいとき、このオブジェクトインスペクタのカテゴリ別表示ってのは、いらつくもんだ。オブジェクトインスペクタの上でマウスを右クリックして、[表示形式|名前順]を選択すれば、見つけやすくなる。

さて、ボタンをクリックしたときの処理だが、Button1のイベントってやつを設定する。オブジェクトインスペクタの[イベント]タブをクリックする。

Hide image
01fig_23

図23 オブジェクトインスペクタ

ずいぶんたくさんのイベントがあるが、それはそれだけいろいろなアクションを定義できるってことだ。だが、今使うのは、OnClickイベントのみ。こいつの値列をダブルクリックすると、コードが表示された。

Hide image
01fig_24

図24 OnClickイベントの設定

ここに次のようなコードを入力する。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ShowMessage("Hello World, Hello " + Edit1->Text +"!");
}

Edit1に入力した名前に対して、Helloと言ってやるのだ。しゃれてるだろう。さあ、とにかく実行だ。

[F9]を押すと、コンパイル、リンクののち、次のようなウィンドウが表示される。

Hide image
01fig_25

図25 プログラムの実行

味も素っ気もないインターフェイスだが、気にせずテキストを入力する。

Hide image
01fig_26

図26 メッセージの表示

どうだ、なかなかのもんだろう。

このプロジェクトも捨てちまうのはもったいないので、適当な名前をつけて保存しておこう。しかし、勝手に名前をつけるところが多すぎるな。人間至れりつくせりだと堕落するもんだぞ。オレ的にはそう思う。

Server Response from: ETNASC01