春休みの宿題です。
卒研でのプログラミングにつなげるために,「分割コンパイル」と
「ライブラリ」の概念を理解してもらうための宿題です。
なお,この宿題は adv-10-05 と adv-10-12 と adv-10-19 と全く同じですので,
これらをすでに行った人はやらなくても良いこととします。
■ bas-01-11-01
「明解C言語 実践編」第11章をすべて読み,
そこに書いてあることをすべて「自力で」試してください。
ソースコードは著者のページからダウンロードできることはできますが,
手で打って違いを理解しないと意味がないので,ダウンロードせずに
ソースは手で打ってください。
なお,『Visual Studio (Visual C++)』と『Cygwin + gcc』とでは
やり方がまったく異なります。
この手の分割コンパイルは Visual Studio の方が遥かに簡単ですが,
一方で Cygwin + gcc では面倒臭い代わりに何が起きているかを
把握しやすいというメリットがあります。
好きな方を使って良いですが,卒研では大抵 Visual Studio を使いますので,
この機会に Visual Studio を使うことを強くお勧めします(*1)。
今回はプロジェクトがいくつかできると思うので,
そのプロジェクトフォルダごとに圧縮したものを提出してください。
ちなみにこの問題は,次の「自分でライブラリを作る」という
問題をやるための準備でもあります。
*1: Visual Studio には,有料の Professional 版と無料の Express 版があり,
前者は皆さんのPCには入れてあります。
家で試す場合は Express 版で十分です。
■ bas-01-11-02
01の問題で作った「1文字入出力ライブラリ」は,最終的にはソースコードの
ままでした。
これを後から別のプロジェクトで再利用しようと思った場合,
新規に作るソースコードと「1文字入出力ライブラリ」のソースコードとが
入り乱れて,区別がつきにくくなるというデメリットがあります。
そこで,ソースコードのまま再利用するのではなく,1つのオブジェクトファイル
の状態である「スタティックリンクライブラリ」を作り,
それを再利用する,というのをよくやります。
これだとソースも入り乱れず,また適度に中身を隠蔽できるという
メリットがあります。
そこで,「1文字入出力ライブラリ」をスタティックリンクライブラリ化
してください,というのが今回の課題です。
また,新規に別のプロジェクトを作り,そこからそのスタティックリンク
ライブラリをリンクして,正しくコンパイル&実行できることを確認してください。
なお,Visual C++ ではスタティックリンクライブラリの拡張子は「.lib」,
Cygwin + gcc のそれは「.a」です。
ここまでが理解できれば,他人が作ったスタティックリンクライブラリなどの
意味や使い方もわかるようになるでしょう。
それらを使うことで,今までの「C言語の純粋な機能だけですべてを実現していた」
のに比べて,できることが飛躍的に広がります。
例えばうちの研究室で良く使っている ARToolKit や OpenCV などは
そういったライブラリの代表格です。
(ARToolKit: 拡張現実感用ライブラリ。OpenCV: 画像処理用ライブラリ)
■ bas-01-11-03
02の問題で,「1文字入出力ライブラリ」をスタティックリンクライブラリに
してもらいました。この場合,そのスタティックリンクライブラリを
作ったのもみなさんですから,そのライブラリのソースコードも
当然みなさんの手元にあります。
一方,そうではなく,『スタティックリンクライブラリと
ヘッダだけしか提供されず,それを使う側は,そのライブラリのドキュメントに
従ってプログラミングをしていくしかない』という場合も良くあります。
そこで今回はそういうのを実際に体験してもらいます。
題材は,「tiff」(ティフ)という画像形式をプログラムで操作できる
フリーのライブラリ「libtiff」とします。
libtiff を VC++ 向けと Cygwin+gcc 向けにスタティックリンクライブラリに
したものを,
http://kujiraiken.sit.ac.jp/~sakapon/kougi/2011-semi/libtiff/
に置いておきました。
また,libtiff を利用するサンプルとして,
write.c
というソースコードもいっしょに置いておきました。
というわけで,『libtiff をリンクして write.c をコンパイルする』
というプロジェクトを作ってください。
また,正しく実行できることを確認してください。
(正しく実行できると,output.tif という画像が生成されます。)
write.c を改変する必要はありません。が,中身を見ると,
TIFFOpen() とか TIFFSetField() とかの,本来 C 言語には
存在しない関数をいくつか使っているのが見て取れると思います。
また,TIFFTAG_IMAGEWIDTH とかのオブジェクト形式マクロもあります。
これが,『ライブラリが提供してくれた関数やマクロ』ということになります。
というのを write.c から感じとっておいてください。
なお,スタティックリンクライブラリは,プロジェクトの一部に
含むような設定にしてください。つまり,C:\Program Files\Visual Studio
とかに置くのではなく,プロジェクトのどこかに置いて,
それを参照できるような設定としてください。
このようにすることを「ポータブルにする」という言いかたをしますが,
ポータブルな状態なら,私に提出されたものをそのまま私の手元でも
ビルドし直せて確かめられるはずです。
ポータブルの意味については,坂本研ローカルWebの
『VisualStudioのプロジェクトは「ポータブル」にしよう』という
ページ
( http://www.sakalab.sit.ac.jp/index.php?VisualStudio%A4%CE%A5%D7%A5%ED%A5%B8%A5%A7%A5%AF%A5%C8%A4%CF%A1%A4%A1%D6%A5%DD%A1%BC%A5%BF%A5%D6%A5%EB%A1%D7%A4%CB%A4%B7%A4%E8%A4%A6 )
にも書いておきました。
—-
坂本 政祐
埼玉工業大学 工学部 情報システム学科
mailto:sakapon@sit.ac.jp