第55章 もう少しマシなライブラリを作ろう


何ともはや、変な表題です。

前回は、ライブラリの作り方をやりましたが 今回は、その内容を少しましなものにしてみました。 C言語では現在の日付や時刻を取得するのが意外に 面倒くさいですね。そこで、現在の日付、時刻を 取得する関数を作り、これをライブラリにすれば 便利ですね。time関数やら、localtime関数については、 すでにC言語編第26章で解説していますので 忘れてしまった人は復習して下さい。 ここでは、現在の時刻や、日付を取得する関数 get_time, get_date関数を作りこれをライブラリにします。

#include <time.h> int get_time(int *hr, int *min, int *sec) { struct tm *mytime; time_t long_time; time(&long_time); mytime = localtime(&long_time); *hr = mytime->tm_hour; *min = mytime->tm_min; *sec = mytime->tm_sec; return 0; } char *get_date(int *year, int *mon, int *mday) { struct tm *mytime; time_t long_time; static char *day_of_week[] = {"日", "月", "火", "水", "木", "金", "土"}; time(&long_time); mytime = localtime(&long_time); *year = mytime->tm_year; *mon = mytime->tm_mon + 1; *mday = mytime->tm_mday; return (day_of_week[mytime->tm_wday]); }

これらの関数の引数をポインタにしていることに 注意して下さい。どうしてポインタにしたかわからない人は C言語編第31章を復習してみて下さい。 ポインタにしておかないとこの関数を呼びだしても 呼び出した方の関数内にある変数には何の影響もないからですね。 そして、構造体へのポインタについてもよく復習しておいて ください。そして、get_date関数の戻り値がchar型へのポインタであること にも注意して下さい。「日」「月」などの文字列を返すからですね。

うーん、それにしてもCはポインタがやたらでてくるな・・・

はい。これは、C言語の宿命です。あきらめてください。 ポインタがわからないとCもC++もわからなくなります。 いきなりC++を始めても、C++の特徴を勉強する前に ポインタで嫌になってしまいますから、今のうちに ポインタはマスターしておいて下さい。マスターといっても すべての使い方を知るということではありません。 このHPに出ている程度のことをマスターしただけでも かなり複雑なことができるようになります。 ポインターはこのHPで解説している以外にもまだまだ 高度な使い方がありますが、超初心者は(筆者も含めて) 普通の使い方ができればよいでしょう。

上の関数から、ライブラリを作って下さい。 メモリモデルはとりあえずsmallでよいでしょう。 いろいろなメモリモデルのライブラリを作って ライブラリの名前の最後にs,m,lなどの文字をくっつけて どのメモリモデルのライブラリなのか一目でわかるように しておけば便利です。たとえばsmallメモリモデルの ライブラリならxxxs.libなどのようにします。 ここでは、スモールメモリモデルしか扱わないので lib03.libという名前にしました。 次は、このライブラリに含まれている関数の プロトタイプをヘッダーファイルに書きます。

// lib03.h int get_time(int *, int *, int *); char *get_date(int *, int *, int *);

はい。これで形は整いましたね。 後で、このライブラリに関数を追加するときは ライブラリマネージャ(LIB)を使ってコマンドライン上から 作業をします(マイクロソフト)。コマンドラインから作業をしたくない人は 上のソースに、関数のソースを追加コピーして 統合環境からライブラリを作ってもよいですね。 昔は、コンピュータの性能があまりよくなかったので 統合環境で作業をすると大変時間がかかりました。 しかし、現在はコンピュータの性能がよくなり 統合環境で作業をしても時間的にはほとんど差がありません。 便利なものはどんどん使いましょう。

さて、今作ったライブラリが正しく動作するか テストプログラムを作ってみましょう。

#include <stdio.h> #include "lib03.h" #include <string.h> int main(void) { int yr, mon, mday, hr, mn, sec; char yobi[3]; strcpy(yobi, get_date(&yr, &mon, &mday)); get_time(&hr, &mn, &sec); printf("本日は%d年%d月%d日,%s曜日です。\n", yr, mon, mday, yobi); printf("ただいま%d時%d分%d秒です。\n", hr, mn, sec); return 0; }

はい、ずいぶん簡単なプログラムになりましたね。 get_date関数を呼び出すときについでに、yobiにこの関数の 戻り値をコピーしています。また、このmain関数内のローカル 変数はアドレスを各関数に渡すことにより値を代入してもらっている ことに注意して下さい。

ライブラリも、支障なくできたようですね。 メデタシ、メデタシ。

最後に大事な注意ですがライブラリマネージャなどを使って

絶対に、既存の(コンパイラに付属の)ライブラリに自作の関数は 追加しないで下さい

既存のライブラリがおかしくなって泣きを見ないためです。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Mar/04/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。