さて前回Hello Worldをお約束的に作ってみたわけだが、
あくまで文字出力したにすぎないので今回は何かしらのデータを表示しようと思う。
とりあえず目標としてはカレンダーの出力なわけだが、
C言語による日付の扱いを見ているとどうやら「構造体」なる物が必修のようだ。
構造体とは要するに値の集まった集合体のようなものらしい。
で、今回なぜこれが必要かと言うと時間を取ってくる関数が時間の情報を構造体で返してくるというのだ。
なので構造体を理解しなければならないよう。
ざっくりと資料を読む限りはデータの構造の塊の変数。
厳密には違うのかもしれないが、要はPerlの連想配列のもっと型が決まってる版みたいなものだろうか。
とりあえず現在の年を表示してみた。なんにも考えずにちょっとアレンジして書き写し。
# main関数に関しては、コメントで指摘いただいたので修正しました。多謝!
コード
#include <stdio.h>
#include <time.h>
struct tm *date; /* 日付の構造体 */
time_t now; /*時間の格納*/
int main(int argc, char* argv[]){
time(&now); // 現在のシステム時刻を取得
date = localtime(&now); // 現在の日付情報の構造体を取得
printf("%d 年\n", date->tm_year + 1900); // 今年を出力
}
結果
おお。出た出た。
注意点としては
time.hをインクルードしなければならないという事。
で、その中に定義されている構造体"tm"と言うのがあってそこでは以下の用に定義されているらしい。
struct tm
{
int tm_sec; // 秒
int tm_min; // 分
int tm_hour; // 時
int tm_mday; // 日
int tm_mon; // 月
int tm_year; // 年
int tm_wday; // 曜日
int tm_yday; // 1月1日からの日数
int tm_isdst; // サマータイムの有無
};
で、time_t型ってなんぞやと思って調べると説明しているサイトを見つけた。
次に、time_t型を紹介します。これはtypedefで定義された型の別名です。一般的に次のように定義されています。
typedef long int time_t;
time_t型は、暦時間(カレンダー時間)を表現するために使われます。暦時間は、現在の時刻を何らかの方法で数値化した情報で、<strong>どんな形式かははっきり定義されていません。</strong>
どんな形式かはっきり定義されていません。って言われてるのでまぁ なんでも入るんだろうというくらいの認識で今はいよう。
要するに上のコードでは、time関数にtime_t型の変数nowを参照渡しでデータを受け取り、
そのあとlocaltime関数でそのデータを時間の構造体tmに変換。
その後構造体の値tm_yearに1900足して(これはPerlと同じで年は-1900された状態で取得されるので)出力した。
日付を扱うことで一歩カレンダーに近づいたが、今度は自分で指定した時間の構造体を作れるようにしなければ。