Borland C++ Compiler 5.5 FAQ

 [Borland C++ Compiler 5.5について]

[Borland C++ Compiler 5.5ってどんなもの?]

 インプライズ(株)が無償で配布しているC++コンパイラと開発ツールです。インプライズのWebサイト(http://www.inprise.co.jp/cppbuilder/freecompiler/)にて入手することができます。

 このパッケージには,「C++コンパイラ,リンカ」,「C標準ライブラリ,STL(C++による標準テンプレートライブラリ),Win32 SDK」,「make,リソースコンパイラなどの開発ツール」が含まれています。これらはいずれもDOSプロンプト(コマンドライン)上で動作するツールで,いわゆるウィンドウが出てそこで作業をするプログラムではありません。また,このパッケージに統合環境やRADなどは含まれていません。

 この開発環境のなかにはWin32 SDKが含まれているので,さまざまな「Windowsプログラム」を作成することができます。また,DirectX SDKなども利用できます。最新のSTLもあるので,GUIプログラムには向いているとはいいませんが,それ以外はひととおりのプログラムを作って試すことができるでしょう。

 逆にDOS用のプログラムのうち,DOSのファンクションコールを用いたり,各環境固有のライブラリを含むプログラムのソースコードは,そのままでは利用できません。そういう目的にも使えますが,お薦めはできません。

 GUIを効率よく作ったり,クラスライブラリを使って本格的な作業をしたい場合は,このコンパイラが含まれた統合開発環境であるBorland C++Builder 5を購入して使ったほうがよいと思います。

to Index...

[最新バージョンはどうなのよ?]
 2000年8月31日に新バージョン「Borland C++ Compiler 5.5.1」が公開されました。このアップデートモジュールには,次のような変更点があります。 詳細な修正点については,英語で,Borland C++Builder用ですがInpriseのWebサイトに掲載されています。

 致命的な問題がいくつか解決されていますので,なるべくアップデートしてください。

to Index...

[インストールの方法はどうなの?]
 インストール方法については,Yuukiさんの[Webページ]のほうが詳しいので,そちらをご覧ください。ここで紹介されているC MAGAZINE編集部で用意しているsetbccプログラムは[こちら]にあります。2000年9月現在,Ver. 1.4になっています。

 C MAGAZINE2000年5月号には,インストール方法のほか,コマンドライン,Windowsの各プログラム,DLLの作り方を示した記事が掲載されています。こちらも参考にしてみてください。

to Index...

[コマンドラインオプションはどうなっていますか?]
 前バージョンではヘルプファイルにコンパイラであるbcc32.exeやリンカなどのコマンドラインオプションが載せられていませんでしたが,Borland C++ Compiler 5.5.1から含まれるようになりました。そちらをご覧ください。
to Index...

[うまくコンパイルすることができません]
 さまざまな要因が考えられます。まず,次のことを確認してください。
インストールは正しく終了しましたか?
 無事に終了していないとファイルが正しくリンクできず,コンパイル作業ができません。

パスの設定と環境ファイルは正しく設定されていますか?
 パッケージのドキュメントファイルにも明記されていますが,インストール後に「パスの設定」と「環境ファイルの作成」を行わなければいけません。Windows 95/98をお使いの方はautoexec.batなどにパスの設定をしてください。また,インストールしたディレクトリの下のBinディレクトリ(そのままの形でインストールしたのならc:\Borland\bcc55\Bin)に「bcc32.cfg」,「ilink32.cfg」をそれぞれ作成して,そこにライブラリやインクルードファイルを収めたディレクトリ名を記述しなければなりません。
 もし面倒なようでしたらsetbccというプログラムを使ってください。これを使えば両方ともウィザード形式で設定できます。

ディレクトリ(フォルダ)は正しく設定されていますか?
 パスの設定と環境ファイルで正しいディレクトリに設定されているかどうか,確認してください。インストールした先のディレクトリ(そのままでインストールしたのならc:\Borland\bcc55\)に置かれている環境ファイルbcc32.cfg,ilink32.cfgのそれぞれの内容も確認してください。
 ソースファイルを置いたディレクトリとDOSプロンプトで表示されているディレクトリが違うこともあります。Explorerなどでディレクトリ名を確認して「cd」コマンドなどを使ってディレクトリを移動してください。

ファイルがないといわれていませんか?
 もし「なんたら.cファイルが見つからない」など,コンパイラに直接指定したソースファイルがないと怒られた場合は,本当にそのファイルがないことも考えられます。もう一度Explorerなどを使って,ファイルがそのディレクトリに存在しているかどうか調べてください。
 また,拡張子が必ず「***.c」という形になっている確認してください。「***.c.txt」のようになっているときは「***.c」になるようにファイル名を変えてください。メモ帳を使ってファイルをセーブするとファイル名に.txtという拡張子が加えられてしまうようなので,メモ帳を使っている方は気を付けてください。
 Explorerで拡張子が表示されない設定になっている方は,「マイコンピュータ」をダブルクリックして[表示(V)]→[オプション(O)...]もしくは[フォルダオプション(O)...]を選び,表示タグを開いてください。そこに「登録されているファイルの拡張子は表示しない」というチェックボックスがあるので,それを非選択(マークが付いていない状態)にして,OKボタンを押します。これで拡張子が表示されるようになります。

リンクするファイルがないといわれていませんか?
 コンパイルしてもうまくいかず,「xxx.objがない」などといわれたときは,インストールしたオブジェクト/ライブラリファイルのファイルサイズを確認してください。まれに一部のリンクファイルが何らかの事情で,内容がない0バイトのファイルになっていたりすることがあります。こんなときは,Borland C++ Compiler 5.5を再インストールしてください。

IMEを使わずに,いわゆる半角英数字で統一していますか?
 全角文字が含まれていると何かとトラブルのもととなります。ソースファイル中に日本語を記述する以外は,できるだけIMEをOFFにして半角英数字で入力を統一してください。また,プログラムによっては自動的にIMEがONになってしまうものもあるので,そのあたりも気をつけてください。

DOS用,PC-9801,PC/ATなど特定環境向けのプログラムをコンパイルしようとしていませんか?
 Borland C++ Compiler 5.5は,Win32アーキテクチャ上のプログラムを作るコンパイラです。PC-9801,PC/ATなど特定環境向けのソースコードやライブラリは,そのままではコンパイルすることができません。こうした昔のソースコードをそのまま使いたいときには,InpriseのWebサイトのみで販売している「Borland C++ Suite」のほうが適任です。Win32プラットホーム以外のプログラミング開発ならこちらをお薦めします。

 以上を確認していただいてもわからないときは,gohodoji@neco.nuまでご連絡ください。いっしょに悩めばきっと糸口が見つかるはずです。たぶん^^;

 あんまりにもわからなすぎるのであれば,製品であるBorland C++Builder 5を買ったほうがサポートなどの面も含めてトータル的にいいかと思います。

to Index...

[Windows95でコンパイルしたプログラムを実行すると暴走したり文字表示が狂う]
 Windows95 OSR2以前(Windows 95,Windows 95A)でコンパイルを行い,作ったプログラムを実行すると, などが起きることがあります。これはどのようなプログラムでも起きるもようです。

 この問題は,Borland C++ Compiler 5.5.1から修正されました。該当する方は,アップデートを行ってください。

to Index...

[grepの使い方]
 複数のファイルに指定した文字列が含まれているかどうかを探すツールが「grep」です。Borland C++ Compiler 5.5をインストールすると,binディレクトリにインストールされます。ソースコード中にどの関数が呼び出されているのか,どの変数が利用されているのか,それを追いかけていくのに便利なツールです。……とまあ,これも何をいまさらという感じですが,「grepは,見つけたファイル名と何行目にあるのかを教えてくれないの?」という質問を受けて,「えーっ??」となったところからここに加えておきます。
指定した文字列がどのファイルに含まれるか探す
たとえば「void」というファイルが拡張子.cのファイルのうち,どれに含まれているか調べるときは,
grep void *.c
というように指定します。こうすると,そのディレクトリにある拡張子.cが付いたファイルを全部探して,そのなかにvoidという文字列があったとき「ファイル名」,「見つけた行の内容」のふたつを表示します。
 *.cというのは「何でもいい名前」.cのファイルを探す,という意味です。逆にnantara.*ということになると拡張子は何でもよいけど,ファイル名はnantaraにかぎるということになります。

サブディレクトリを含めて指定した文字列を探す
 サブディレクトリ(現在プロンプトに表示されているディレクトリに置かれているディレクトリ)に置かれているファイルも調べるときは,
grep -d 探す文字列 ファイル名
というようにします。

見つけた文字列の行数を表示する
見つけた文字列がファイルの何行目にあるのかというのは,
grep -n 探す文字列 ファイル名
で調べることができます。こうすると行を表示するとき,その行の先頭に行数を付け加えて出力します。

検索結果の表示をファイルとして保存する
あまりに大量の表示がされるときはファイルにしておいて,それをあとでメモ帳など何かしらのエディタで見るほうが便利です。そのときは,
grep オプション 探す文字列 ファイル名 >保存するファイル名
とします。たとえば,先ほどのvoidを探す例では,
grep void *.c >voidlist.txt
とすればvoidlist.txtというファイルが作られます。
 「>」はリダイレクトといい,指定したデバイスやファイルに画面の表示された文字列を渡す役目をします。ちなみに「>」ではファイルを上書きしますが,「>>」とすると内容をファイルに追加することができます。

関数の宣言を探す
 よく「あの関数はどんな引数だったっけ?」ということがあります。そんなときはincludeファイルに対してgrepを行うのもひとつの手です。たとえば,
grep -d printf c:\borland\bcc55\include\*.h* >search.txt
とするとsearch.txtに検索結果が出力されるので,そのなかから宣言が載っているものを探します。
ほかにもいろいろな使い方ができます。試してみてください。
to Index...

 [プログラムを作るときの基礎]

[コンソールプログラムの作り方]
 いわゆる普通にDOSプロンプトで利用できるプログラムのことです。main関数から始まる形になります。「へろ〜わ〜るど」という1行の文書を出力するC言語のプログラムなら,
#include <stdio.h>

int main(void)
{
    printf("へろ〜わ〜るど\n");
    return 0;
}

といった形になります。これをテキストエディタなどからhello.cとして保存しておきます。面倒くさい方は
[hello.c]を適当なディレクトリへ保存して置いてください。ここでは「c:\Borland」にファイルを置いたことにします。

このソースファイルをコンソールプログラムとしてコンパイルするには,DOSプロンプトから,

cd c:\Borland
bcc32 hello.c
と入力し,Enterキーを押します。そうすればコンパイルが始まり,「hello.exe」という名前の実行ファイルが作成されます。もし,コンパイラがうまく動かなかったときは,このFAQの「うまくコンパイルすることができません」を見てください。

 C++を使って同じような内容のプログラムを作るには,
#include <iostream>
using namespace std;

int main(void)
{
    cout << "へろ〜わ〜るど" << endl;
    return 0;
}

のような内容のソースコードをテキストエディタなどで「hello.cpp」として作り,適当なディレクトリに置いておきます。同じく面倒くさい方は[hello.cpp]をクリックして適当なディレクトリへ保存して置いてください。ここではC言語のときと同じく「c:\Borland」に置くことにします。

 あとは,C言語のときと同じようにして,

cd c:\Borland
bcc32 hello.cpp
とすれば実行ファイルが作られます。
to Index...

[ウィンドウズプログラムの作り方]
 VCLなどのクラスライブラリはまったくないので,APIだけの操作で作ります。ソースコードを示すと,
#include <windows.h>

/* --------------------------------------------------- */
static char szAppName[] = "Windows Sample Application";
static char szMainClass[] = "Sample-MainWndClass";

/* --------------------------------------------------- */
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg) {
      case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


/* --------------------------------------------------- */
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                     LPSTR lpszCmdLine, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS wc;

    if (!hPrevInstance) {
        wc.style            = CS_HREDRAW | CS_VREDRAW; 
        wc.lpfnWndProc      = WndProc;
        wc.cbClsExtra       = 0;
        wc.cbWndExtra       = 0;
        wc.hInstance        = hInstance;
        wc.hIcon            = NULL;
        wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground    = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wc.lpszMenuName     = NULL;
        wc.lpszClassName    = szMainClass;
        RegisterClass(&wc);
    }
    hwnd = CreateWindow(
                szMainClass,
                szAppName,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                640 + GetSystemMetrics(SM_CXBORDER) * 2,
                400 + GetSystemMetrics(SM_CYCAPTION)
                    + GetSystemMetrics(SM_CYMENU)
                    + GetSystemMetrics(SM_CYBORDER) * 2,
                NULL,
                NULL,
                hInstance,
                NULL);
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

とまあ,何とも懐かしい作りになります。この例はクライアント領域が640×400のウィンドウを作るだけのプログラムです。

このソースファイルをwintest.cとして適当なフォルダに置いてください。ここでもc:\Borlandに置いておくとします。これをコンパイルするときは,

cd c:\Borland
bcc32 -W wintest.c
として,「-W」命令を加えてください。このソースファイルとコンパイル用のバッチファイルを
[winsample.lzh]にまとめましたので,検証用に使ってください。
to Index...

[DirectXを使ったプログラムの作り方]
 Win32関連がいろいろと付いているので,DirectX関連のプログラムも作ることができます。次のように設定してください。
DirectX SDKをインストールする
DirectX SDKはマイクロソフトのWebサイト(http://www.microsoft.com/japan/developer/directx/downloads.asp)にて無償で配布されています。また,各雑誌などの付録CD-ROMからも入手できます。これをまずインストールしてください。現在のところ最新版は「Direct X 7a」となっています。ここではこのSDKを利用して説明します。

環境ファイルを設定する
DirectX SDKをそのままインストールすると「c:\mssdk」というディレクトリにさまざまなファイルが展開します。このうち「インクルードファイル」と「ライブラリファイル」が置かれているディレクトリを環境ファイルに書いておきます。たとえば,bcc32.cfgは,

   -I"c:\mssdk\include";"c:\Borland\Bcc55\include"
   -L"c:\mssdk\lib\Borland";"c:\Borland\Bcc55\lib"

ilink32.cfgは

   -L"c:\mssdk\lib\Borland";"c:\Borland\Bcc55\lib"

のようにそれぞれのファイルを書き替えてください。
 なお,Borland C++ Compiler 5.5ではすでにDirectX 7相当のインクルードファイルやライブラリファイルが含まれていますが,DirectXすべてをサポートしているわけではないので,最新のDirectX SDKのインストールをおすすめします。

 上記の設定が終わったら,試しにコンパイルしてみましょう。DirectX 7a SDKに含まれるサンプルソースコードをコンパイルしてみます。もしこのとき,同じディレクトリに*.defファイルがあるようなら,その名前をコンパイルする前に変更しておいてください。これはどのサンプルでもそうしてください。

 サンプルソースコードのうち,DDex1ディレクトリに含まれるddex1.cppをコンパイルするには,「ddex1.defのファイル名を変更」してから,下記のように実行してみてください。

cd c:\mssdk\samples\Multimedia\DDraw\src\DDex1
bcc32 -W ddex1.cpp ddraw.lib dxguid.lib

 これでコンパイルがされ,実行ファイルが作成されます。できた実行ファイルをExplorerからクリックして,うまく動くかどうか試してみてください。

 サンプルソースコードのなかにはリソースの埋め込みが必要になるものもあります。そのときは前述の方法でリソースファイルを作成し,リンクしてください。

 なお,DirectX利用に関する制限はBorland C++Builderと同じです。

to Index...

[OpenGLを使ったプログラムの作り方]
 DirectXだけではなく,OpenGL用のプログラムも作成することができます。こちらについてはdluさんのWebページ(http://www.jouban.prug.or.jp/exp/~kit/)に環境構築方法とサンプルプログラムをコンパイルするまでを解説されています。そちらを参考にしてみてください。

 また,OpenGLを使った開発についての情報も載せられているので,いろいろと参考になると思います。お薦めします。

to Index...

[シリアルポート(RS-232C)を使ったプログラムの作り方]
 シリアルポート(RS-232C)を始めとする各種デバイスの使い方は,Borland C++BuilderやVisual C++などでも利用されているWin32 APIを利用して行う方法と同じです。CreateFile()により,デバイス名(COM1,COM2など)を指定して開き,そこへWriteFile()やReadFile()などの関数を使って読み書きすることでデータの通信を行います。

 通信速度の設定などはSetCommState()など専用のAPIを使います。このようにほとんどのシリアルポートを制御するAPIには,「なんたらCommなんちゃら」という名前が付けられています。

 受信バッファにどれだけデータが溜まっているのか知るには,ClearCommError()を利用します。たとえば,

DWORD errorVal;
COMSTAT comstat;

ZeroMemory(&comstat, sizeof(comstat));
ClearCommError(handle, &errorVal, &comstat);
のように実行すると,comstat.cbInQueに受信データのサイズ(バイト数)が格納されます。この値のぶんだけReadFile()からデータを読み込めば,受信したデータを得ることができます。

 サンプルプログラム[rs.lzh]には,これらを利用してシリアルポートと通信を行うC++のクラスcrs232cを作ってみました。参考にしてみてください。ちなみにこのクラスは,WonderWitch用の自作転送プログラムsenditに使われています。

to Index...

 [プログラミングに役立つもの]

[コモンダイアログの表示]

 「ファイルを開く」,「プリンタの設定」など,どのアプリケーションでも利用できるダイアログとして「コモンダイアログ」があります。この表示を行うプログラムを作り,コンパイルしてみると,どういうわけかWindows 98/Windows NT4以下では,コモンダイアログが表示されません。

コモンダイアログを表示できるようにするには,

#define _WIN32_WINNT 0x400
#define WINVER 0x400

という宣言をソースコードのいちばん始め,#include などのインクルードファイルの宣言よりも先に宣言するか,もしくはコンパイルするときに

-D_WIN32_WINNT=0x400 -DWINVER=0x400

という命令を指定してください。これにより,コモンダイアログが表示されるようになります。

 これらについては,サンプルプログラム[dlgtest.lzh]にまとめておいたので,使ってみてください。この例では適当なキーを押すと「ファイルを開く」ダイアログが表示され,ファイル名の取得状態をメッセージボックスで表示します。

 この情報については小林均様よりご提供いただきました。心より感謝します。

to Index...

[メイクファイル(*.mak)の作り方]
 個人的には石野恵一郎さんが作ったKI-makeを愛用しているので,何ともあれですが……^^; 構成としては次のようになっています。
# ---------------------------------------------------
#テスト用メイクファイル(makefile)
#by Gohodoji
#
#で始まる行は1行コメントとなります。
# ---------------------------------------------------

#↓コンパイラを定義します
cc  = bcc32

#↓コンパイルオプションです
cflags =

#-Wなどターゲットを示すオプションはcflags=以降に書いてください
#cflags    = -W #などとなります。

# ---------------------------------------------------
#コンパイルするファイルを定義します
#nameには実行ファイル名/ソースファイル名を入れます。
name = test
exe = $(name).exe
objs = $(name).obj

# ---------------------------------------------------
#↓生成規則です
.cpp.obj:
    $(cc) $(cflags) -c $<

$(exe): $(objs)
    $(cc) -e$(exe) {$**}

#川俣様の指摘により{$**}に修正しました。ありがとうございます。2007.1.23
 上記のファイルが[makefile]となります。このうち,#がコメント,$(なんたら)が「なんたら」への置換となっています。

 もし,複数のオブジェクトファイルやライブラリをリンクするには,objs=のところを,

objs = $(name).obj foo.obj   #……と繋げていく
と書き替えてください。このようにして複数のソースファイルを持つプログラムの例をmakesample.lzhに置いておきます。

 実際に使うには,makefileファイルとtest.cppを同じディレクトリに置き,そのディレクトリへcdコマンドを使って移動してから,コマンドラインで,

make
とだけ打ち込んで実行すればコンパイルされます。

 このあたりは,かつてのTurbo CやBorland Cについて書かれた本があれば,そちらのほうが詳しいはずです。

to Index...

[リソースファイルの含め方]

 リソースとは,Windowsでは「プログラムのアイコン」,「メニュー」,「ボタン」などを定義しているデータのことです。これらをBorland C++ Compiler 5.5で使うには,「リソースファイル」を作って,それを実行ファイルに組み込まなければいけません。

 前バージョンではbrc32.exeによるリソースの埋めこみができませんでしたが,Borland C++ Compiler 5.5.1より,修正されました。

リソース定義ファイルを作る
プログラムに含めたいリソースがアイコンの場合,「IDI_ICON1 ICON "icon1.ico"」のように記述したテキストファイルを用意し,それの拡張子を「なんたら.rc」とします。この書式は「宣言名(プログラムではこれを使う) 種類 "ファイル名"」という形になっています。

ソースコードでリソースを使う
定義した宣言名を
    LoadIcon(hInst, "IDI_ICON1");
といったように直接使うようにします。

ソースコードをコンパイルしてプログラムを作る
通常のようにWindowsのプログラムを作るのと同じようにしてコンパイルします。

リソース定義ファイルを組み込む
リソース定義ファイルをコンパイルし,リソースファイルを作り,それをます。先ほど作ったテキストファイルを「test.rc」,できたプログラムが「test.exe」というファイル名にして,同じディレクトリに置いたとすると,

    brc32 test.rc

とDOSプロンプトから実行することでリソースファイルがプログラムに埋め込まれます。これでアイコンデータが実行ファイルに含まれます。もしプログラムとリソースファイルの名前が違うときは,

    brc32 test.rc foo.exe

というようにリソースファイル名の次にプログラム名を置いて実行してください。
 上記の手順を簡単に検証できるように,プログラムやコンパイルするためのバッチファイルなどを[ressample.lzh]にまとめておきました。また,これらをmakefileを使って書いたものを[resmake.lzh]に置いておきます。通常の開発であれば,こちらのmakefileにいろいろと加えて拡張していくとよいでしょう。

to Index...

[*.rhファイルがなくてリソースファイルがコンパイルできない]

 前バージョンのBorland C++ Compiler 5.5をデフォルトのままインストールした場合では,リソースファイル用ヘッダファイルである,winnt.rh,winuser.rh,commctrl.rh,dde.rhが含まれていません。そのため,これらを読み込むように指定したリソースファイルをコンパイルしようとすると「ファイルがない」と怒られてしまいます。

 このファイルは現在の最新バージョンであるBorland C++ Compiler 5.5.1に含まれているので,こちらのほうをインストールすればコンパイルできるようになります。

 なお,これらのファイルをインストールしただけでは,コンパイル中にまだ「ファイルがない」と怒られてしまうかもしれません。そのときは「brc32にインクルードファイルのディレクトリを指定する」の項目を参考にして,brc32にファイルが存在するディレクトリを教えるようにしてください。これでリソースファイルをコンパイルできます。

to Index...

[brc32にインクルードファイルのディレクトリを指定する]

 リソースファイルでインクルードしているファイルがディスク上に存在しているのにbrc32から「ファイルがない」と怒られてしまうことがあります。こんなときは,

brc32 -i"c:\Borland\bcc32\include" なんたら.rc

というように「-i」オプションでそのファイルが置かれているディレクトリを指定してください。

 いちいちこうした指定が面倒というときは,環境変数「include」にそのディレクトリ名を設定します。たとえば,DOSプロンプトから,

set include=%include%;c:\Borland\bcc32\include

のようにして実行します。パソコンを再起動してもこの指定が有効にしたいときは,

のいずれかの方法で,この環境変数の設定を行ってください。

これらの設定作業は,setbcc Ver. 1.3以降で対応しました。面倒に思った方はsetbccを使ってください。

to Index...

[MMX命令を含むアセンブラコードを使いたい]

 MMX命令については「_asm {……};」でのインラインアセンブラによる利用となると,アセンブラであるtasmがパッケージに付属していないため,そのままでは利用することができません。これについては,

のいずれかになってしまうと思います。

 小林均様のWebサイト(http://www.ky.xaxon.ne.jp/~hitoshi/programming/BCCMMX/BCCandMMX.htm)には,値をコードに直接埋め込む「__emit__文」を使ってMMX命令を使う方法が紹介されています。参考にしてみてください。

 また,NASM(The Netwide Assembler)というx86系用のフリーのアセンブラがあります。MMX命令はもとより,TurboDebugger用のデバッグファイルを出力できるなど,とても高性能です。使うには,まずNASMのWebサイトから「Where is it?」のページから各ftpサーバへのリンクが貼られていますので,そこからたどってWin32用のバイナリパッケージを入手してください。目的のzipファイルを入手して展開するとふたつの実行ファイルが得られます。これをパスの通ったディレクトリ,面倒でしたらbcc32.exeが置かれているディレクトリ(デフォルトならC:\borland\bcc55\Bin)にコピーしてください。おもに使うのはnasmw.exeという実行ファイルになります。

 Borland C++ Compiler 5.5とNASMを組み合わせて使う方法については,Mc.NさんのWebページ(http://homepage1.nifty.com/mcn/weekly/000730.htm)に詳細が掲載されています。

to Index...

[プログラムの引数の処理とワイルドカードの処理]
 コンソールプログラムで重要なユーザーインタフェイスとなるのは,プログラムの引数(コマンドラインオプション)です。これを使うとプログラムで使うファイルの指定などを行うことができます。

 これらは,「int main(int argc, char *argv[])」という宣言により,main関数で受け取ることができます。argcには「いくつ指定がされたか,その個数+1」,argvには「それぞれの文字列」が含まれます。たとえば,「foo -d bar.txt」と実行したときは,「argcには3」,「argv[1] == "-d"」,「argv[2] == "bar.txt"」というように格納されます。また,argv[0]には,プログラムが起動したパス名+プログラムのファイルが入ります。

 ちょっと試してみるには,
#include 
using namespace std;

int main(int argc, char *argv[])
{
    for (int i = 0; i < argc; i++) {
        cout << i << ": " << argv[i] << endl;
    }
    return 0;
}

といったコードを
[argtest.cpp]として保存し,それをコンパイルすることで内容を確認できるでしょう。

 さて,これらをオプションとして切り出し,プログラムの処理と結び付けることには,いくつかの方法があります。また,それぞれプログラマが特長としているところでもあります。

 私の場合は,昔から,
typedef void (*opt_funcptr)(char *);
typedef struct {
    char *name;
    char *help;
    opt_funcptr func;
} opt_func_t;


void opt_ist(char *s)
{
    printf("t opt: %s\n", s);
}

void opt_iso(char *s)
{
    printf("o opt: %s\n", s);
}

void opt_ise(char *s)
{
    printf("e opt: %s\n", s);
}

opt_func_t opt_list[] = {
    "t",    "option is t",  opt_ist,
    "o",    "option is o",  opt_iso,
    "e",    "option is e",  opt_ise,
    "",     "",             NULL,
};

int opt(char *s, opt_func_t *list)
{
    if ((s == NULL) || (s[0] == '\0'))
        return false;
    s++;    /* '-' or '/' skip */
    for (; list->func != NULL; list++) {
        if (!jstrnicmp(list->name, s, strlen(list->name))) {
            s += strlen(list->name);
            (*list->func)(s);       /* exec cmd */
            return true;
        }
    }
    return false;
}

void opt_print_help(opt_func_t *list)
{
    printf("options are:\n");
    for (; list->func != NULL; list++) {
        if (list->help == NULL)
            printf("\n");
        else
            printf(" -%-4s = %s\n", list->name, list->help);
    }
}

void set_filename(char *s)
{
    printf("file: %s\n", s);
}

void usage(void)
{
	fputs(USAGE_MSG, stdout);
	opt_print_help(opt_list);
}

int main(int argc, char **argv)
{
    if (argc == 1) { 
        /* ファイル名が指定されていない */
        usage();
        return 0;
    }
    while (*++argv != NULL) {
        if ((**argv == '-') || (**argv == '/')) {
            if (!opt(*argv, opt_list))
                fprintf(stderr, "このオプションは知りません: %s\n", *argv);
        } else {
            set_filename(*argv);
        }
    }
    
    return 0;
}

といったように関数ポインタとそのテーブルを利用しています。関数ポインタの処理とヘルプの文字列が対で書けることで,よりプログラミングがわかりやすくなると信じています:)。いまとなってはSTLを使ってもう少しオブジェクト指向っぽく書いたほうがいいかもしれません。まあ,こんなやり方もあるということです。

 ファイル名にワイルドカードを指定した場合,プログラムにはファイル名に展開されず,そのまま渡されます。つまり「foo *.*」などとしたら,そのままargv[1]に「*.*」が渡されるので,これをファイル名にするには自前でファイルを探さなければなりません。

 こりゃあめんどう,というわけでBorland C++ Compiler 5.5に付属している「wildargs.h」,「wildargs.obj」を利用しましょう。wildargs.hを「#include <wildargs.h>」としてmain()があるソースコードの始めでインクルードしておき(),コンパイルするときに「wildargs.obj」をリンクします。このとき,ライブラリのあるパス名を必ず指定しておきます。これだけの作業でファイル名に展開してから,引数として渡してくれます。これは便利ですね。

 これらをまとめたサンプルプログラムとして,引数の内容を表示するだけの簡単なものを[argv.lzh]に置いておきます。適宜参考にして使ってみてください。なお,このファイルはC言語で書かれていますが,C++でももちろん利用可能です。

to Index...

[もっと情報を!]
 さまざまな方がいろいろな情報を提供しています。ここではそれらのリンク先を紹介しておきます。リンクにご許諾いただいたそれぞれのWebページ制作者の方々に心から感謝いたします。
[メーカー]
INPRISE Japan Online Borland C++ Compiler 5.5 Information
配布元であるインプライズのWebサイトです。ここからパッケージを入手できます。

Turbo Debugger 5.5日本語版
インプライズが無償で提供しているデバッガ「Turbo Debugger 5.5 日本語版」です。Borland C++ Compiler 5.5で作ったプログラムをデバッグすることができるIDEタイプのデバッガです。

Borland C++ Compiler 5.5 サポート情報
Borland C++ Compiler 5.5に関するQ&Aをまとめたものです。本Webページにも載っていないことが多く掲載されているので,困っているときはぜひご覧ください。

[ツール]
C MAGAZINE for Web
C MAGAZINEのWebサイトです。環境ファイルやパスの設定を行うsetbccは,こちらで入手できます。C MAGAZINEは本屋さんで手に入るプログラミング情報を集めた雑誌です。

GenBCC
Windowsのアプリケーションとしてエディタ画面を表示し,そのうえでBorland C++ Compiler 5.5を実行できる統合開発環境的なプログラムです。

CBar
マルチファイルの管理,makefileの作成とその実行(コンパイル)が行えるツールです。エディタは好きなものを利用できます。こちらも統合開発環境的なプログラムです。

Borland C++ Compiler Supporter「Crescent」
Borlnad Delphiで作られた統合開発環境的なプログラムです。起動するとエディタ画面が出るので,そこでソースコードを入力します。コンパイルなどはボタンひとつで行えます。

TNTCEdit
エディタ内蔵タイプの統合開発環境的なプログラムです。選択範囲のコメント化など,実用的な機能を備えています。プログラムの実行にはVisaul Basic 6のランタイムライブラリが必要です。

[ライブラリ]
Borland C++ Compiler 5.5 + el の設定について
小林さんのWebページです。Borland C++ Compiler 5.5を使ってDirectX用のクラスライブラリ「el」を使用する方法が紹介されています。

3D Linux Unkown
Borland C++ Compiler 5.5を用いたOpenGLの環境構築方法とサンプルプログラムをコンパイルするまでを解説されています。

[メーリングリスト]
bccompilerメーリングリスト
Borland C++ Compiler 5.5に関するメーリングリストです。bccompiler-subscribe@egroups.co.jpへ空メールを送ることで,参加することができます。詳しいことやメーリングリストのログについてはWebサイトのほうをご覧ください。

[情報]
Borland C++ Compiler 5.5をインストールして「ちょっと」使ってみる
YuukiさんのWebページです。インストール方法やコマンドラインオプションなどが掲載されています。

BCB5.5
guriponnさんのWebページです。メニューなど,リソースの含め方などが日記形式で掲載されています。

Fmailオンラインヘルプ
Fmailというメールソフトの拡張機能をBorland C++ Compiler 5.5で作ることができるそうです。

Borland C++ Compiler 5.5 でNASMを使う
Borland C++ Compiler 5.5を弄ぶ
Mc.NさんのWebページです。NASMの利用方法やdll,OpenGL,DirectXなどさまざまなソースコードのコンパイルに挑戦されています。

msdn online Library
Win32APIの詳細については,米Microsoftが公開しているMSDNのWebサイト版で見ることができます。検索するには,上にあるメニューのうち,「Search MSDN」で行えます。英語だけの情報ですが,サンプルコードが掲載されているので比較的わかりやすいと思います。

DOS/V コマンド・リファレンス
Borland C++ Compiler 5.5はDOSコマンドとして動作するコンパイラです。さまざまなDOSのコマンドと併用することで便利に開発が行えます。DOSのコマンドの使い方や種類についてはこちらのWebサイトに詳しく書かれているので,参考にしてください。


 これ以外の情報をお持ちの方は,ぜひここへリンク先を掲載させていただけるととても嬉しいです。メールにてgohodoji@neco.nuまでお気軽にご連絡ください。

to Index...

[トップページへ戻る]