こんにちは､ そしてお帰りなさい｡
この講義では､ c標準ライブラリが提供するユーティリティ関数のいくつかを紹介したいと思います｡
これらは､ まさに皆さんが考えているような､ さまざまなことを行うためのユーティリティや汎用的な一般関数です｡
ユーティリティ関数を使うには､ 通常､ 標準のlibにあります｡ h.
そのヘッダーファイルをインクルードするわけです｡
これから説明する機能の中には､ 便利な機能だけのものもあります｡
ひとつは､ 絶対値abs｡
BASE関数は､ 引数の絶対値を返します｡
絶対値とはプラスに変換することです｡
だから､ マイナスなどを渡すと､ プラスの値を返してくれる｡
出口という関数があります｡
メイン機能で少し使っています｡
これは整数をとり､ 通常は戻り値で､ 負の数はエラーがあることを意味し､
正の数またはゼロはエラーがないことを意味し､ 1はエラーがないことを意味します｡
この場合､ プログラムは終了してしまいますが｡
すぐに飛び出しますよ｡
メイン関数の中でreturnを行うと､ メイン関数から戻ることができます｡
しかし､ exitは通常､ プログラムを終了させることです｡
数字を使いたくない場合は､ exit success や
exit failure などの定数も定義されています｡
その他､ 参照したいライブラリの関連ルーチンは､
終了時に重要です｡
そして､ これはかなり多くのCプログラム､ 特にabortで見ることができます｡
アボートは､ mallocができないなど何らかのエラーが発生したときに､ アボートを呼び出すことがあり､
シグナルに設定することができます｡
abortの良いところは､ 信号に応じてコアファイルを生成してくれるところです｡
Coreファイルはデバッグに役立つので､ さらに詳しい情報を得ることができます｡
しかし､ exit abortとatexitは非常に便利な関数で､ 通常､ 致命的なエラーが発生したときに呼び出されます｡
環境変数を読み込むことができるget environment関数があります｡
環境変数は､ 通常､ あなたの環境に関連するものです｡
これは､ オペレーティングシステム上のどこでも使えるグローバル変数のようなものです｡
Linuxであれば､ パスの環境変数があるわけです｡
Windowsには､ パスやプログラムの場所を指定するための環境変数や､
一般的なグローバル変数があります｡
環境変数を設定し､ それを読み出すには､ この関数get environmentを使用します｡
そして､ その環境変数を読み込んで､ プログラムの中で使用することができます｡
また､ パスなど､ シェルや環境に関連するものです｡
Get environmentはとても便利です｡
qsort関数がある｡
void ポインタ配列が指すデータ配列をソートします｡
つまり､ 最初のパラメータとして受け取った配列があり､ それをソートするのです｡
配列にはn個の要素があり､ それぞれのサイズが長さに噛んでいることになります｡
そして､ nとsizeはsize tの型である｡
つまり､ この関数に渡す変数は4つです｡
でも､ qsortは配列の並べ替えができるからいいよね｡
第4引数には､ ソートに使用したい関数へのポインタを指定する｡
だから､ より複雑になることもある｡
しかし､ この関数は､ 配列の2つの要素を比較する必要がある場合に非常に便利です｡
比較したい要素へのポインタを渡すことができます｡
ランダムな関数がある
私たちは､ これをある課題ランドで使っています｡
これにより､ 乱数が生成されます｡
別の関数で必要ならシードを指定してもよいし､
最小値3276､ 最小値ゼロランダム､ 最大値3276の間の乱数を生成するだけである｡
そのため､ rand maxは標準のlibで定義されています｡ h.
シードを提供するsran関数と一緒に使うことが多いでしょう｡
種は一定の範囲を提供することができます｡
そうすれば､ 数字もよりランダムになるかもしれません｡
そこで､ 乱数発生器を符号なしintにシードしています｡
Systemは､ システムコールを実行するために呼び出すことができる関数です｡
授業で使ったのは､ ポーズをとるときです｡
しかし､ ディレクトリの変更､ Linuxならパーミッションの変更､
他のプログラムの実行など､ コンソールから実行できるものはすべてシステムを通して行うことができます｡
そして､ これは実際にシェルでコマンドを実行します｡ それがDOSプロンプトであれ､
Linuxでシェルを使っている場合であれ､ です｡
そのコマンドを実行します｡
例えば､ system make dir と言えば､ make dir の引数で指定したディレクトリが作成されます｡
すべて二重引用符の中なので､ 文字列を受け取ります｡
システムもとても､ 便利です｡
アサートライブラリは､ デバッグに便利です｡
アサートについてはあまり話す機会がなかったのですが､ 簡単に触れておきたいと思います｡
アサートしているのは図書館です｡ hと､ デバッグに役立つ1つです｡
だから､ アサートは何かを真実だと言っているのです｡
そのため､ コードの中にassertを記述することで､ 次の行に進む前に何かが真であることを確認することができます｡
使用するアサートマクロがあり､ 内部式のような引数を取ります｡
式が false と評価された場合､ assert マクロは標準エラーストリームにエラーメッセージを書き､
abort 関数を呼び出します｡
それでプログラマーが終了するんですね｡
ですから､ 基本的には次のようなことをコードに書けばいいのです｡
zはxのx倍からyのx倍を引いたものに等しいと言えるでしょう｡
そして､ zが0以上であると断言することができる｡
もしこれがfalseを返したら､ プログラムは終了します｡
そうでない場合は､ 次の行を実行します｡
つまり､ コード全体で本当の意味での思い込みをしているようなものです｡
ある値がどうなっているかを確認してから､ 次に進みたいものです｡
これは､ ゼロで割るようなことがないようにするためで､ この掛け算をするときにゼロの値を持っていないことを確認します｡
デバッグのためにcプログラムの中にassertを入れるのはよく見かけますね｡
その他に調べておくと便利なヘッダーファイルは､ timeです｡ h.
時間です｡ hには､ さまざまな日付や時刻をサポートするためのさまざまな関数やマクロがあります｡
通常､ 時間t構造体を返す｡
でも､ 日付はわかりますよね｡
時間を確保することができます｡
エルノ h または errornumber｡ h.
エラーを報告するためのマクロを定義しています｡
デバッグや特定のエラーの報告のためによく使われる｡
だから､ 標準ライブラリで使っている多くの関数がある｡
失敗した場合､ 特定のエラーに対して数値を返すことがあります｡ あるソケット機能を他のものに使用する場合､
様々なエラーが発生する可能性があるので､ より重要なことなのです｡
ただ単にエラーがあると言うのではなく､
何が起こっているのかを知ることは有用な場合もありますが､ 特定の種類のエラーと言うのはあまり役に立ちません｡
そのため､ これを用いてエラー番号を取得することで､ さらなるデバッグに役立てることができます｡
ロケール h.
このヘッダーには､ さまざまな通貨や貨幣単位をフォーマットするための関数やマクロがたくさん用意されているんだ｡
信号のことです｡ h.
これは､ 通常､ 異なる信号を生成するプログラム終了のために有用である｡
シグナルはあまり詳しく説明しませんが､ プログラムがクラッシュしたり､
プログラムが終了したときに､ 特定のシグナルを指定してアボートを呼び出したりするときに便利でしょう｡
そして､ シグナルを理解すれば､ これらをコアファイルでも使用することができます｡
Stdarg. h.
これは､ 関数に可変数の引数を渡すことができるようにするためのさまざまな設備､
varargsを定義しています｡
vargsやprintfは使っていますが､ argの関数は自分たちで作っていません｡
より高度なテーマです｡
しかし､ これらは基本的なヘッダーファイルであり､ 時間やエラー番号などを取得するのに便利だと思われます｡
これらは良い効用関数です｡
というわけで､ 参考になったでしょうか｡
ありがとうございます｡