C/C++プログラマへアドバイス - やまざき@BinaryTechnology
「デスマーチと戦う武蔵流プログラマ やまざき のページ」

TopPage
(サイトマップ)


Book
(書籍)


「火事場プロジェクトの法則」
サポートページ


「LHAとZIP」
サポートページ



Document
(文章)

デスマーチの記録に見る
運命の分かれ道
NEW!

武蔵流プログラマからの提言

武蔵流プログラマが斬る Eclipse

コードデザイン最前線
1
2 3 4 5 6 7 8 9
10 11 12 13 ML

C++で読む
デザインパターン


ポインタ不要論

データ圧縮の基礎

プログラマへの
アドバイス


データ指向の話1 2

インターフェースの話


Diary & Books
(日記と本屋)

やまざきの
はてなダイアリ
(日記)
[] [PC] [資産運用]
[デスマ] [映画] [2足ロボ]

やまざきの本屋


SoftWorks
(ソフトウェア)


(1) DeepFreezer
(ディープ・フリーザー)
高速アーカイバ

(English Page)

(2) Closedown-Planet
(クローズダウン・プラネット)
アクションパズルゲーム


(3) PieceMaker
(ピース・メーカー)
ファイル分割/結合


(4) WakuPita
(枠ピタ)
ウィンドウ移動便利ツール

(English Page)

(5) ググ郎
(Bookmarklet)
選択文字列をGoogleで検索

NEW!


Developing
(開発中)


(1) DeepFreezer2
yz2dlg.dll alpha6


C Magazine特集yz2


Hobby & Favorite
(道楽/お気に入り)


2LegRobo
MindStorms



p.s.
(雑談)


Profile

i_want^^;


やまざきが書いた本


[システム開発]
火事場プロジェクトの法則
どうすればデスマーチをなくせるか?
2006/09/13 発売


LHAとZIP
圧縮アルゴリズム×プログラミング入門

奥村さんと共著です。
2003/12/01 発売


やまざきが寄稿した本


SEの読書術
「本質を読む」力を磨く10の哲学 2006/02発売。



開発の現場 Vol.002
「反デスマーチ大研究」という記事。2005/09/13発売。



Software People Vol.3
「武蔵流プログラマからの提言」という記事。2003/10/31発売。



Eclipse パーフェクトマニュアル vol.1
「武蔵流プログラマが斬る Eclipse」という記事。2003/06/05発売。




C/C++プログラマへアドバイス

●はじめに

 最近、メールや掲示板などで、C/C++プログラミングに関する質問が増えてきました。
 何度も同じ質問に答えるのも時間の無駄というか、いま自分が思っていることをまとめると言う意味で、ある程度「プログラマもしくは、プログラマを目指す人へのアドバイス的なモノ」をここに書き連ねてみます。アドバイスとはいえ、私の力量ではたいしたことは書けませんので、あまり期待しないように。ただのリンク集になる可能性も・・・無いとは言えない^^;。

(なお、ここにあるリンクはほぼすべて無断でリンクさせていただいています。リンクしないでほしいという方がおられましたら、メール下さい。即刻対応させていただきます。m(__)m)


●「プログラミングってなに?」「プログラムの勉強をしたい」という方へ

 プログラミングを勉強したいのでC/C++を勉強したいという人は多いと思います。

 まず最初に注意点として「C/C++は、言語として、高度で、奥が深く、簡単にすべてを見通せるものではない!」ということです。驚かしていますが、それだけの覚悟が必要な言語であることをまずは理解してください。

 確かにC/C++を習得すれば、他の言語を知らなくてもまったく問題ないほど「ほとんどのプログラム」を作ることができます。そのことは逆に「それだけいろいろなことができる」「それだけ奥が深い」ことも意味しているのです。

 もともと、誰でも簡単にプログラミングできるように配慮されて作られた言語ではなく、UNIXのカーネルを記述するために、プロな人がコンピュータの資源をフルに引き出すために、なんでもできるような強力なツールとして作ったモノなのです。
 そのため、よりハードウェアに密着した知識、物理メモリの概念や、実行時のメモリの状態(静的とか、動的とか)、CPUのタイプ(ビックエンディアンとか、リトルエンディアンとか)の知識が必要とされ、あきらかにその他の言語(FORTRAN,BASIC,COBOL,Pascal,etc...)より多くの知識が必要となります。
 よって、C/C++はプログラミングの勉強に「適した言語では無い」とも言えます。他の言語を簡単に習得した後、C/C++にステップアップする道をお薦めします。

 で、純粋にプログラミングの勉強をしたいのであれば「JavaScript」がお薦めです。JavaScript は FORTRAN,BASIC,COBOL,Pascal などの言語と同じ用に、ハードウェアの概念は隠蔽されていてプログラミング時に考慮する必要はありません。普通の言語はハードウェアは隠蔽されるのが一般的で、C/C++が例外的とも言えます。
 まずはこれで、一通り「プログラミングとはどういうモノか?」を習得し、その後(メモリとはどういうものか?勉強しつつ^^;)C/C++へステップアップすると良いでしょう。

「JavaScript」の良いところは、

  1. 構文がなんとなく C/C++ に似ている。(同じではないので注意は必要だけど、それほど深刻に悩むことでは無い)
  2. なんと、ただで手に入る。
  3. インタプリタなのでPCが暴走&ダウンすることは無い。(C/C++では簡単に暴走する。^^;)
  4. ホームページへの流用が可能。(他人に自慢できるという、ちょっと美味しい優越感が得られる。^^;)
  5. なんと、ゲームを作っている人もいる。(それだけのポテンシャルを持っている。)
 なのです。特に(2)の「メモ帳」と「IE」があれば(普通の Windowsマシンなら最初から入っているので)、今すぐ実行可能な初心者にお薦めの言語なのです。

 ちなみに、JavaScript は Java とはまったく違う言語なので、混同しないように、ご注意下さい。

 インターネットで JavaScript と検索すれば、たくさんの文献が見つかると思いますが、お薦めはこちら↓。(長い間更新されていないみたいだけど^^;)

独学JavaScript http://www.ueda.info.waseda.ac.jp/~gaku/js/

 さらに JavaScript は マイクロソフトによって、JScript と名前を変えて、いろいろ強化され、現在も強化は進行中?(最近は更新されていないけど、そろそろ消えたりして^^;)であり、WSH(WindowsScriptingHost)など Windows系のバッチ処理言語として使われています。JScript や WSH は JavaScript はマスターしたので、さらに極めたいというプログラマにお薦めです。 JScript は JavaScript に Windows系の処理オブジェクトが追加され、さらに構文も C++ に近くなるよう強化されています。JScript と WSH についてはこちら↓を参照のこと。サンプルプログラムや、Win95/98で WSH を動かす環境が無料で手に入ります。
Microsoft Scripting Technologies http://www.microsoft.com/japan/developer/scripting/default.htm

2003/06/02: 追伸: 最近思うのは、Flash でプログラミングの勉強とかするのもいいかも…と。ActionScript という言語でコードが書けるのですが、Flashの体験版なら無料ですし…コードを書かなくても遊べますし。いろんな入門にいいかもしれません。


●「C/C++をはじめるのに、どの本を買ったら良いでしょうか?」という方へ

 C/C++の本はたくさんありますね。どれでも良いと思いますし、どれもそんなに変わらないと思います。(そんなに細かくチェックしているわけではないので、詳しくはわからないです。柴田 望洋 氏や、林 晴比古 氏の本がわりとメジャーですね。)
 で、はっきり言ってしまえば「初心者に適切な本は無い」ような気がします。どれも文法や書き方の説明に重視し、C言語の危険性や、間違いやすいコード、初心者の陥りやすいバグなどの解説はまずありません。逆に、危険なコードをサンプルとして載せている本がたくさんあります。

 たとえば、サンプルコードに「while(*p++){ ...」などというコードがなんの警告も無く書かれていたらその本は「要注意」です。 理由はたくさんありますが、まず変数名が 'p' 一文字というのは意味不明だしバグの元なので危険です。 また、while 文は条件式を書くところなのに「短く書けるから」という理由だけで実行文を書き込んでいるところも「危険」です。 だいたいこのコードを見てどんな動きをするのか?簡単に理解できないとこを知りつつ、それでもサンプルとして書いているというスタンスもヤバイです。 そもそもC言語で「コードが短く書ける」のはただの特徴の1つであって、必ずしも「短く書かなければならない」とか、「長いコードはそれだけ性能が落ちる」とか、そんなことはまったく無いのに、それを知りつつ短いコードを書くメリットなんてなにも無くて、それはデメリットだと思うのですけど、なぜサンプルに載せるのでしょうね。そんなに紙とインクが勿体無いのでしょうか?。勿体無いのでしょうね。うーん、思わず愚痴ってしまいました。失礼。^^;

 そんなわけで「どの本でも同じ」なので「お薦めの本は無い」ってことで納得していただけないでしょうか?。^^;
 ただ、これは必須というか、熟読はしなくても机においておいて辞書のようにパラパラと見る本として、以下の2冊をお薦めします。
 ですが「初心者用の本ではない」のでくれぐれも気をつけてください。はじめて読んでも読み切れないと思うし「さっぱりわからない」とも思います。しかし、この本は「わかりやすい本」ではなくて、教科書というか、C/C++の基本が書いてあり、みんながこれを読んでいて、これを元にこの世界が動いているという背景が重要なのです。くれぐれもその点を誤解の無いよう気を付けてください。


 プログラミング言語C 第2版」 共立出版ISBN4-320-02483-X C3041 P2800E

と、
プログラミング言語C++ 第3版」 アスキーISBN4-7561-1895-X C3004 P7000E

この2冊は外せないと思います。

 どちらも「腐ってもANSI規格準拠」ってやつでして、たとえボロでも標準規格があるととってもたすかるのです。ホントに私はそう思ってます。
 なぜって、標準規格が無いと、このコンパイラでは動くのに、別のコンパイラではエラーになる などという、なんとも不便なことが起こるのです。これが、標準規格のおかげで、この標準規格を守っていればどのコンパイラでも問題無く動くコードが書けるのです。これは、プログラマにとって、とっても助かることなんです。

 また、人に説明する時や、答える時でも「これらの本の何ページに載っている」などの話がよくあるので、買っておいて損は無いです。というか、買いましょう。^^;

 で、プログラミング系の本は全体的に値段が高いので、値段を見てしり込みする人も多いようですが、この世界の運命というか、そんなに数が出ないので、しかたがないですね。あきらめましょう(^^;。

 最後に、やまざきの内緒の一押し本を紹介しておきます。それは
C/C++によるプログラミングスタイルブック林 晴比古 著 A5判 ISBN4-7973-1183-5
です。
 C/C++プログラマの中には林氏を嫌う人もいるようですが、この本は良い本だと思います。(他の林氏の本はあまり読んだことがないのですが^^;) どこがどう良いのか?というと、私がプログラミング時に一番気をつけている「可読性」について書かれている本だからなのです。こういった可読性に焦点をあてた本は少なく、貴重な本だと思っています。ただ、これはC/C++の解説本ではないので、C/C++が知りたい人は他の本も合わせて買いましょう。


●「C/C++をはじめるのに、どのパッケージ(開発環境)を買ったら良いでしょうか?」という方へ

 よく「お薦めのC/C++環境は?」と聞かれますが、お薦めできるモノって、無いんです。(^^;
 その人に合った環境が有るだろうし、そんなに安いものでも有りませんので。「なにをしたいか?」によって決まると思うのです。

 で代わりというか、今、私が主に使っている環境を書きますと、基本は Windows で、VC++6.0です。
買ったのはこっち↓。
Microsoft Visual Studio 6.0 Professional Edition http://www.microsoft.com/catalog/display7.asp?site=737&subid=36ですが、
使っているのはこれ↓。
Microsoft Visual C++ 6.0 Standard Edition http://www.microsoft.com/catalog/display7.asp?site=755&subid=36です。

 私が、VC++ を使っている理由は、とにかく C++ としてのポテンシャルの高さがあります。
 最新の STL や、テンプレートをサポートしていますし、コンパイルの速度、最適化の能力、強力なデバッガ、至れり尽くせりのエディタ、ヘルプの情報量、ほとんどの項目でトップクラスなのです。(それなりにお金をかけて作っているだけのことはあるということ^^;)
 また、使っている人も多く、文献が多い(多すぎる)のもメリットだと思います。

 で、VC++ は C++ としては良い環境なのですが、Windows系のプログラムを作ろうとすると、MFCというクラスライブラリが出てきて、急に難しくなるのです。(個人的にはMFCは VC++ の唯一の汚点だとも思っています^^;)ので、Windows系のプログラムを作るならこれ↓
ボーランド http://www.borland.co.jp/
C++Builder http://www.borland.co.jp/cppbuilder/index.htmlが良いと思います。
 VB と似た RAD 環境と C++ というなんとも不思議な取り合わせの環境です。(というか VC++ もこのくらい簡単に Windows プログラムが作れるべきであると思いますけど。^^;)
 そうそう、C++Builderの「三角の実行ボタン」は挙動が怪しいので、押さないほうが良いと思います。ファンクションキーを使いましょう。微妙に挙動が違うようです^^;。
で、私が使っているのは C++Builder ver.5です。

 あとは互換性のチェックのために、GCC を使っています。汎用性のあるコードを書かないとせっかく書いたコードも無駄になってしまいますので。自分の書いたコードが、ANSI 仕様なのか、VC++ 特有の機能なのか、よく把握しておくことも重要です。
 知らずに VC++のみのコードを書いていて、あとで泣くのもいやですから。こまめに、複数の環境を使いこなすのも良いことだと思います。
 VC++ で出ないエラーも、GCC で出たり、またその逆もあります。両方の環境でエラーの出なくなったコードこそ互換性のあるキレイなコードであると私は思っています。

 たとえば、CString は VC++ でしか使えないクラスですが、std::string は VC++ でも GCC でも使えます。ってことは、std::string を使ったほうが、互換性が高く、今後「何かとお得」ということなのです。

 で、GCC は いろいろな種類がありますけど、Windows系なら DJGPP が良いかと。
 DJGPP を動かすために必要な最小限度のものは
http://www.delorie.com/djgpp/
のサイトから
  • djdev202.zip, bnu281b.zip, gcc2951b.zip, gpp2951b.zip, lgp2951b.zip
  • mak377b.zip <- make を使わない場合は必要ない
  • csdpmi4b.zip <- DOS窓で使う場合は必要ない
これらのファイルを解凍して、同じフォルダ(DJGPP)に入れて、autoexec.bat に
set DJGPP = C:\xxxx\DJGPP\DJGPP.ENV
set PATH = C:\xxxx\DJGPP\BIN;%PATH%
(xxxx は各環境に合わせる。)を追加するだけです。
 わりと簡単に C++ の環境が「ただ」で手に入ります。挑戦してみてください。
でも「MS-DOSプロンプトってなに?」な人には使いこなせないので、そこは勉強して下さい。

 あと、小さくて、フリーなC言語として有名なのは「LSI-C-86試食版」があります。
 いきなり、C++へ行くよりも、C言語からゆっくり勉強したい人はこちらが最適でしょう。
 最低限の知識として DJGPP と同じように「MS-DOSプロンプト,LZH解凍,テキストエディタ」は必要です。難しい話ではないので、こちらも勉強勉強^^;。
 「LSI-C-86試食版」は
エル・エス・アイジャパン株式会社 http://www.lsi-j.co.jp/index.html
フリーソフトウェア集 http://www.lsi-j.ab.psiweb.com/freesoft/index.htmlにあります。
ここを見てもよくわからない人は
C言語入門インターネット版->LSI C-86 v3.30cについて http://homepage1.nifty.com/toshio-k/prog/c/ を参照のこと。


●「C/C++をはじめたけど、良く分からない」という方へ

 JavaScript へ戻ることができるなら、そちらから再スタートと言うのも1つの選択肢だと思います。

 C/C++をはじめて最初につまずくのはおそらく「型ってなに?」「型変換(キャスト)ってなに?」 と、この当たりでつまずいている人も多いと思います。

 JavaScript や perl など「型」という概念の無いプログラミング言語は実はたくさん有ります。(VBもそうかも)(型の指定ができるのに指定しなくてもOKという言語は「型の概念が無い」と解釈してます。)

 なぜ、「型」という概念が必要になってくるかと言うと、小さなプログラムを組む場合はそれほど問題無いのですが、大きな(100行とかを超える)プログラムになってくると、変数の数が増えてきます。それに伴い、その変数を「なにに使っていたのか?」「数値を入れていたのか?」「文字を入れていたのか?」わからなくなってしまい「数値を入れるところなのに文字を入れてしまったり」またその逆をしたり、まちがいやすくなるのです。(バグが入りやすいとも言う)
 ここで「型」という概念を持ち込んで、この変数は「数値(int)専用」とかこの変数は「文字列(string)専用」とかを決めることで誤って数値(int)の変数に文字列(string)を入れることをなくそう、という概念なのです。
 Cコンパイラが型のチェックをしますので、型の違う代入はエラーとなり実行できないのです。
 逆に、エラーの無いプログラムでは型の違う代入は無い(数値(int)の変数に文字列(string)などは入れていない)ちゃんとしたプログラムである ことになるのです。

 要するに、大きなプログラムになると変数の管理が大変なので、変数の使い方の間違い探しをコンパイラがチェックして手伝ってくれる ありがたい仕組みなのです。^^;

 で、こういったC/C++の質問を受け付けてくれる掲示板がいくつかあるので、そこで質問すれば、たいていの問題は解決します。
 でも、質問する前に、自分の力で問題を解く努力をしましょう。必ずしも前を歩いている人がいるとは限らないので。
 お薦めはこちら↓。
VC++ 超初心者のページ http://cgi.members.interq.or.jp/gold/marken/のなかの
お気楽掲示板 http://cgi.members.interq.or.jp/gold/marken/bbs.htm辺りで聞きましょう。
 で、質問するときは「どんな環境で、どんな現象になって、何がわからないのか?」ちゃんと日本語で書きましょう。なかには「わかりません、教えてください」という文だけという、幼稚園児のような質問もありますが、そんな質問は完璧に無視されますので、って、ここで書くほどのことではないのですけど。たまに見かけるので気をつけてください。

 ここでちょっと蛇足!。「VC++6.0 のちょー簡単な使い方」をこっそりお教えしましょう。
 VC++ って、多機能で、沢山のボタンがあって、メニューもいっぱい、設定もいろいろ。はじめて起動したときは何をして良いのか唖然とするでしょう。
そこで、私が習得した簡単な使い方をお教えします。(って知っている人は読み飛ばしてください。こんなことを自慢するのははずかしいので。^^;)
  1.  まず、VC++ を立ち上げて新規作成で AppWizard・・・なんてダサいことはしません。^^; VC++ は立ち上げないでください。

  2.  いきなりエクスプローラの「新規...」で、フォルダを作ります。名前は適当でいいです。後で変えられますから。これは作業フォルダと言って、このフォルダの中にプログラムに関係するすべてのファイルが入る予定です。よって、バックアップもこのフォルダ単位に行えばよいことになります。

  3.  次に、(まだ VC++ は立ち上げない^^;)いま作ったフォルダの中に、また「新規...」で新規テキストファイルを作ります。この時ファイル名の拡張子を a.cxx とか a.cpp などC++の拡張子に変更してください。
  4.  (拡張子を変更するには、フォルダオプションの「□登録されているファイルの拡張子は表示しない」のチェックを外す[OFF]必要があります。標準では[ON]です。これが[ON]だと、ファイル名の変更で拡張子の変更ができないので注意してください。) ファイル名は a.c でも良いですが、この場合、C++のコードはコンパイルできないので注意してください。よく、VC++ なのに C++ のコードがコンパイルできないという話で、拡張子が .c だったという話があります。VC++ に限らず、C/C++の世界では常識なので、そんなことで笑われないように気をつけてください。
     で、この時、ファイル名を a.cxx とすると、実行ファイルは a.exe になります。もちろん test.cpp だと test.exe になります。実行ファイルってなに?って人は、a.cxx で良いです。あとで勉強してください。^^;
     ちなみに拡張子の .cxx と .cpp に特に違いはありません。.cpp のほうが良く見かけるという程度で、私は .cxx を愛用しています。もっと言うと、.h ファイルが必要な場合は .cpp で、不必要な場合は .cxx と分けて使っています。これは、私が「後で見て、わかりやすいように」と勝手に決めたことなのでC/C++の常識ではありません。誤解の無いように。^^;

  5.  そして、もうここで、お気に入りのエディタを起動して、コードを書いても良いですが、その .cxx ファイルをダブルクリックして VC++ を起動します。そこで、VC++ はエディタモードで開きますのでプログラムを入力します。
    最初は、
     #include <stdio.h> // puts(), getchar()
     int main()
     {
         puts( "hit [enter] key!" ) ;
         getchar() ;

         return  0 ;
     }
    が良いでしょう。

  6.  そして、入力し終わったら [F5] キー(実行ボタンと同じ)を押します。ダイアログがいろいろ出ますが、問題ありません。ちゃんと入力できていれば、"hit [enter] key!"と表示された MS-DOSプロンプト(黒い画面)が出るでしょう。おもむろに[enter]キーを押して MS-DOS プロンプトを消しましょう。(プログラムが終了すると MS-DOS プロンプトは自動的に消えるので、[enter] を押すまで、プログラムが動いているようなコードを書きました。)

  7.  MS-DOS プロンプトが出ない方。残念ながらまだまだつづきます。コンパイルにエラーがあると思われます。入力した文字をよーく見てください。それと、プログラムはすべて半角英数字です。全角スペースも不可ですので、気をつけて。あとはひたすら[F5] コンパイル&実行です。
     MS-DOS プロンプトが出た方。おめでとうございます。以上で、終わりです。あなたは C++ でのコンパイルに成功しました。
 この方法は、Windows のプログラムではないので、実行結果は文字で MS-DOSプロンプトに出ます。しかし、それで良いのです。確かに見た目は悪いですが、C/C++には Windows は関係ありません。文字が表示できれば十分C/C++プログラミングはできます。 まして、AppWizard なんて、ややこしいだけでC/C++の勉強にはあまりメリットはありません。Windows系のプログラムを作るときにゆっくり悩んでください。^^;

 VC++を使うときに特に注意してほしいのは、そのコードは「MFC なのか?、Win32APIなのか?、ANSI準拠なのか?」ということなのです。C++の勉強をしているつもりで一生懸命 MFC の使い方を勉強している人をたまに見かけます。また、個人的には MFC はC++のお手本として良い題材とは思いません。STL の勉強をお薦めします。

 VC++を終了すると、先ほど作ったフォルダの中に、いろいろなファイルが作られますが、それは VC++ が作ったファイルです。残しておけば、いろいろなことを覚えておいてくれて、次回からの起動が楽になります。できれば、.dsw プロジェクトワークスペースから起動してください。そちらが2回目からの正しい起動方法になります。最悪 .cxx ファイルがあれば、[F5] を押すだけ で復活できますけど。^^;
 あとは適当にサンプルプログラムを入力して「[F5] を押す」の繰り返しです。include?, puts()?, getchar()??? わからないことが出てきたらどうするのでしたっけ?(^^)。では、 がんばってください。


●「C/C++の上達への道が知りたい」という方へ

 C/C++の上達への道は、

人のコードを、読む、読む。そして、自分でコードを書く、書く。
わからないところは、調べる、調べる。そして、コードを書く、書く。
それでもわからないところは、聞く、聞く。そして、コードを書く、書く。
この繰り返し、です。

 要するに、自分でコードを書くのが一番の上達方法だと思います。
で、最初はなにをどう書くのかわからないと思うので、それは人のコードを参考にしましょう。(まずは上の2つの本が良いです。基本ですから。)
 最近は、コードをインターネットで公開してくれる人が増えまして、良い世の中ですね。
 で、参考にする時に「なんだかわからないけど、動いているからいいや」 ですまさないで、ちゃんと自分の書き方で書き直して、自分のモノにすることをお薦めします。
 どんなコードでも、自分で書くことに「上達への道」があると思います。

 また、ここが重要なのですが「書く」のと「読む」のでは、圧倒的に「書くほうが簡単」なんです。実は。^^;
 なぜか?って、書くのは自分の理解しているコードを吐き出せは良いだけで、逆に、読むには、自分の知らないコード(相手の書き方)も理解しないと、読めない ということだからです。

 たとえば、while() 文なんて知らなくても、for() 文さえ理解していればプログラムは書けます。しかし、誰かが while() 文を使ったコードを書いていたら while() 文を理解していないと読むことはできないのです。
 同じように、ポインタを知らなくても(理解していなくても)ある程度のコードは書けますが、逆に、ポインタで書かれたコードを読むにはポインタを理解していないと読めないということなのです。
 このように、実は「書く」のは簡単なことなのです。(自分の土俵で相撲をとるようなものですから。)
 しかし、人のコードを読むのは大変です。知らない文法を使っていたり、変数の意味がわからなかったり、バグがあるかもしれない。
 とにかく、文法が読めても、相手の「考えていること」まで読まないといけないので大変なのです。

 で、なにが言いたいのか?というと、「人のコードが読めないから自分はC/C++が出来ない」 と勝手に決め付けないでください。と言うことなのです。

 確かに、読めないよりは読めた方がよいですが、読んでもよくわからないコードは結構氾濫しているのです。
 それに惑わされないように、参考にしたコードを鵜呑みにせず、必ず自分で書き直して、自分のモノにしてください。

 それでは、サンプルコードのご紹介。

 まずはC言語のサンプルコード
奥村晴彦のホームページ http://www.matsusaka-u.ac.jp/~okumura/の中の
『C言語による最新アルゴリズム事典』全ソースコード http://www.vector.co.jp/soft/data/prog/se002453.html
 このコードは DeepFreezer を作る時にいろいろお世話になりました。
 ここにあるコードをそのまま DeepFreezer で使っているというわけではありませんので、念のため。^^;

 で VC++ 用の Windows系プログラムのサンプルコードは
エキスパートマグネティックス株式会社 http://www.expertmg.com/のなかの
VC++によるWin32プログラミングTips http://www.expertmg.com/html/cti/vctips/index.htm
 このコードは 枠ピタ を作る時にいろいろお世話になりました。
 同じく、ここのコードを 枠ピタ の中で使っているというわけではありません。参考にさせてもらいました。ということ。^^;


●「C/C++のプログラムがうまく動かない」という方へ

 一番の難関はポインタですね。
 まず、「ポインタと配列は、まったく別のモノである。」という認識をして下さい。
 C/C++の解説で、よく見かける「ポインタと配列は、同じようなモノ」という記述があるのですが、これを鵜呑みして「同じ」と思い込んでいる人も多いと思います。

 「え?違うの?」と思った方は以下の文献を読んで、更に上をめざしてください。

 あと、私の経験では、バグには傾向というか、出て当たり前というか、考え方や書き方の違いで、簡単に出たり、出なくなったりするのです。
 バグが出やすい人は、おそらく、なぜバグが出たのか特に追求せずに、「なんだかわからないけど、バグった。けど、いつのまにか直ったから、いいや」 という考え方をしている人が多いと思います。
 この考え方というかスタンスでは、いつまでたってもバグのお友達です。(^^;

 ちゃんと、バグには、出る理由があるし、その理由を把握すれば、バグを出なくする、もしくはバグを出にくくする方法もちゃんとあるのです。
 で、このあたりを解説した文献は非常に少なく、この部分をクリアすれば、もう「C/C++なんてドンと来い」なのですけど、明快な出口の見えないこの問題に対して、多くの人はここで混沌とした日々を過ごすことになるようです。

 まずは、FAQがあるので、それは一通り目を通しておきましょう。
C言語 FAQ 日本語訳 http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
この日本語訳は、いろいろなページにコピーされているいるようですが、とりあえず、ここ^^;。
 結構、高度なレベルのことが書かれているので、なめてかかると痛い目を見ます。Cはマスターしたと思っている方も、再確認のつもりで、一度目を通すことをお薦めします。

 次に、UNIX システムコールのFAQ
Unix Programming Frequently Asked Questions 日本語訳 http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html
 これは、UNIX 系の話ですが、VC++ でもかなりの UNIXシステムコールが用意されていますので、VC++,GCC 互換のコードを書くのにやくにたちます。でも、知っていたほうが良いというレベルなので、理解できなくても全然問題はないです。

 で、さらに、バグらないための習慣とかの概念を書いている数少ない文献を紹介します。
 C/C++の文献は結構たくさんあるのですが、初級レベルのモノが多く、さらなるレベルアップのための(将棋の駒の動かし方の本ではなく、戦術の解説ような)文献が少ないのがさみしいです。もっとたくさんの人にこの手の本を書いてほしいものです。

まずは、
藤原博文の館 http://www.pro.or.jp/~fuji/のなかの
Cプログラミング診断室 http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
 ここは本の紹介のページなのですが、この本の内容のすべてが書かれています。
 はっきり言って凄い量なので、ネットで読むより本を買ったほうが楽(らく)かも。^^;
 下手なプログラマが読むと、ショックを受けて、いままでのコードを消去するかも知れないので注意が必要です。(冗談^^;)


●「C++ってCと何が違うの?」という方へ

 C++って、Cより難しいですよね。CとC++の本の厚さを比べれば、その複雑さが一目でわかります。それに、オブジェクト指向とか、カタカナばかりだし、抽象的な話ばかり・・^^;
 「Cもマスターしたし、Cができれば大抵のプログラムは書ける。わざわざ難しいC++を習得し、わかりにくいコードを書く意味はあるのだろうか?。」 そう、思っている人もいるかと思います。私も最初はC++の良さがわからない人でした。 そんな人のために「C++はCとはここが違う!」という項目を挙げてみます。
  1. "private:"
     まず、やはり class です。「あ、でたよ、でたでた。結局みんなそう言うんだよ。class って言ったって構造体に毛が生えたモノだろ?」と思った方。違います。構造体 struct と class ではその概念には雲泥の差があります。 class といっても「継承ができるから」なんて言いません。薦める理由は他にあります。それは「カプセル化」です。具体的に書くと情報隠蔽 private:です。
     これが書けるだけで、世界がガラッと変わります。「データ指向」の話でも書いていますが、カプセル化+情報隠蔽こそが、大規模なプログラムでバグを出さずに作り上げるカギである と、私は思っています。

  2. "コンストラクタ&デストラクタ"
     次も、class です。クラスの中で特殊なメンバと言える、コンストラクタとデストラクタですが、これがメチャメチャ便利です。
     何が便利か?と言うと、もっともバグりやすいと言われる「リソースの確保&解放」という処理をそのまま単純かつ効果的に実装できる、こんな便利な機能いったい誰が考えたのでしょうか?。表彰モノです。
     バンバン使ってください。最初は実感がわかないかも知れませんが、使っているうちに良さがじわじわと伝わってきます。 わたしは、この機能がC++にあるために「C++からCには戻りたくない」と本気で思っています。^^;

  3. "const &"
     「コンスト・リファレンス」と読みます。これも強力です。const だけでも、なかなか強力な機能ですし、C言語でも多少サポートされています。 しかし、C++の const や const & はさらに強力です。引数宣言では必須と言っても過言ではないでしょう。バンバン使いましょう。 リファレンスって、C言語な人には「えー、そんなのメリットあるの?、わかりにくいだけじゃないの?ポインタがあるんだからそれで良いじゃん」 と言う方もいるかもしれませんが、違います。データの隠蔽度や安全性がぜんぜん違います。 とにかく、引数にはコンスト・リファレンスです。ポインタなんて使ってはいけません。これです。これに尽きます。

  4. "std::string, std::vector"
     これらはSTLです。STLと言ってもその中の std::string と std::vector です。
    std::string は、C言語の最大の欠点とも言われる文字列操作を克服するテンプレートクラスです。 そんな背景はむしろどうでも良くて、これを使えば C++ で、VB のように文字列が扱えます。 もう危険な strcpy(), strcat(), etc. なんて、使う必要はありません。
     std::vector は、動的配列を実装します。Cでは、malloc() とポインタを使わない限り配列を動的に確保することはできませんでした。 さらに動的に確保したメモリは free() で解放しなければならないという。ややこしく、バグを作りこみやすい仕様でした。 それらの問題をこの std::vector が解決します。とにかくこれも使ってみてください。
     私はこの2つのテンプレートクラスを使うだけで、確実にバグを減らすことができると確信しています。一度お試しください。

  5. ポインタの撲滅
     上記項目 3. 4. であげたC++の特徴を総合すると「ポインタ」を使わずにコードが書けるようになります。100% 撲滅することはなかなか難しいですが、あらかた使わずに(がんばれば 100% 使わずに)コーディングできます。
     C言語で一番問題になるというか、バグの巣窟と言われる「ポインタ」を使わない(もしくは、減らせる)ことは、そのままバグを減らし信頼性のあるコードが書けることを示していると思います。 ポインタでバグを作りこんだ人は多いと思います。メモリリークしたり、変なところをアクセスして落ちてしまったり。これだけハードに密着した機能は他の言語ではなかなか見られません。それだけ強力な機能であるのは認めますが諸刃の刃というか、それだけ危険であり、バグりやすい機能とも言えると思います。
     これだけ強力な機能は常に封印し「ここ一番!、ここで使わなければ男じゃない!」という最終手段、最終兵器的な使いかたがベストであり、それができることがC++の良いところだとも思います。
     CよりC++のほうがポインタの使用を減らせるのは事実です。また、私がCよりC++を好んで使う理由がここにあるのもまた事実です。
 よく、C++は「オブジェクト指向だから」とか「継承ができるから良いんだ」などという、意味不明な言葉を聞きます。 この発言はおそらく、C++をよく触っていない人の発言だと思います。 たしかに、C++はオブジェクト指向プログラミングに向いていますし、継承という機能もサポートしています。 しかし、オブジェクト指向とは、考え方や、設計方針のような概念なので、C++は「オブジェクト指向に向いた記述ができる言語の1つ」なだけです。 さらに「継承」ですが、これもあまりメリットを感じていません。むしろ、保守&改良がしにくくなるというデメリットのほうを強く感じます。(現在、私は、C++の継承機能は使っていません。)
 そんなわけで、上に書いたように、私は「オブジェクト指向」や「継承」などとは、直接関係の無いところで、C++のメリット(良さ)を感じています。
 このC++の良さはおそらく実際にコードを書いてみないと、実感できないこととは思いますが、ぜひ、一度、試してみてください。きっと病みつきになって、C++の魅力から逃れられなくなると思います。^^;


●最後に

 これで終わりですが、なんか、アドバイスというよりリンク集になっていますね。それはそれで、そういうモノだと思ってください。
 なにか「これを読んだけど、まだわからないことがある」とか「ここは違うんじゃない」などのご意見も受け付けていますので、メールまたは掲示板のほうへどうぞ。

では。

last update 2003/06/02
since 1999/12/19


やまざきのおすすめエレクトロニクス


やまざきのおすすめ本

やまざきのおすすめDVD

やまざきのおすすめCD



Copyright(c) 1998-2006.
YAMAZAKI Satoshi.
All rights reserved.

since 1997/12/15


このページのURLをメールで送る(友人・知人に教えてあげる)
このページを「お気に入り」に追加する(忘れないように…)
● お手紙はこちら↓。仕事の話は大歓迎です。(忙しくて返信できなかったらごめんなさい。)