• 締切済み

C言語の関数について教えてください

time_t関数とはどおいう時に使うのかまったくわかりません 調べても暦時間取得するとしか書いていません time(NULL)で現在時刻を取得したらなぜtime_t型変数に格納するのですか? 普通にint型ではいけないのですか? 教えてください 後sizeofについても教えてくださいお願いします

みんなの回答

回答No.1

まず、time_tは関数ではなく型です。 普通に「google」で「time_t」を検索すると、一番最初にwikiにヒットします。 そこに詳しく書いてあります。 sizeofもwikiを見れば分かるはずです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【C言語プログラミング】 time()関数について

    現在の時刻を表示させるプログラムをC言語で作成したいのですが、 書籍などを参考に以下のコーディングを行いました。 #include <stdio.h> #include <time.h> int main(void) { time_t timer; /* 現在の時刻を取得する */ timer = time(&timer); /* 現在の時刻を出力する */ printf("現在の時刻: "); printf("%s", ctime(&timer)); printf("です。\n"); return 0; } 質問内容は以下の通りです。 (1)「time_t timer;」とは、time_t型の変数timerを宣言し、   この変数にはtime()関数で取得した現在時刻の値が入る? (2)「timer = time(&timer);」に関して、time()関数で取得した値   を変数timerが指すアドレスの場所に入れる? その場合、   返り値を格納する変数timerに、time()関数の引数と同じtimerが   指定されているのはなぜ? (3)プログラムを実行すると以下の結果となる。(time.exeを実行)   C:\>time   現在の時刻: 12:52:07.61   新しい時刻を入力してください:   現在の時刻を表示した直後に「新しい時刻を入力して下さい」が   表示される。これはtime()関数の仕様どおり? 以上です。初歩的な質問で申し訳ございませんが、ご回答よろしく お願いいたします。

  • ソフトウェアの仕様書作成について(C言語)

    「電車の時刻表を画面に表示するプログラムについて、詳細仕様を検討して作成しなさい。要求は、ユーザが、現在時刻と到着したい希望時刻を入力すると、今から乗れそうな列車の候補をいくつか提示して欲しいということだけである。 この要求に沿って仕様を詳細に検討しなさい。」 という仕様書作成の問題なのですが、よくわかりません。 とりあえず自分なりにがんばってみたのですが(後述)、どうも不自然さがあふれてて困っています。 どこを直して行けばよいでしょうか? <************ここから*****************> 関数の形式:int train_time(int present_h, int present_m, int arrival_h, int arrival_m, const int time_table[][]) 関数の目的: 時刻表の電車の時間、分をそれぞれtime_table[i][0], time_table[i][1]に読み込み、(iは電車を区別する番号で整数である。) 現在の時間と分をそれぞれpresent_h, present_mから受け取り、また、到着したい希望時間と分をそれぞれarrival_h, arrival_mから受け取る。 時刻表の時刻と比較し、現在時刻以降に発車し、到着時刻以前に到着するすべての電車の発車時刻と到着時刻を表示する。 入力の形式:present_h, arrival_h, time_table[i][0]は、0以上24以下の時間を表す整数  present_m, arrival_m, time_table[i][1]は0以上60以下の分を表す整数 出力の形式:  -1、0以上の整数 説明:  時刻は24時間表記とする。  秒単位は考慮しない。 例外時の処理:  時刻で無いものを受け取った場合、例えば24以上の時間、60以上の分、文字列を受け取った場合などは-1を返す。  NULLを受け取った場合-1を返す

  • C言語での関数形式マクロの使い方

    前の質問No.300834(関数形式マクロと空白の質問)と関連します。 関数形式マクロで、引数として入れるものは、変数でなくて型名でも構わないのでしょうか。 例えば、 #define mymul(t,x,y) ((t)(x)*(t)(y)) と定義すると、 mymul(int, 5.0, 3.5) と呼び出すと、 ((int)(5.0)*(int)(3.5)) に置き換える、 (intでキャストした 5.0 と、intでキャストした 3.5 をかける) というのは可能でしょうか。 あと、関数形式マクロの呼び出しは、実行部分でなくてもよいのでしょうか。関数頭部(関数の本体の前の部分)で呼び出せますか。 例えば #define ARGUMENT3(t1,v1,t2,v2,t3,v3) ¥ (t1 v1, t2 v2, t3 v3) #define a_func b_func ARGUMENT3 と定義しておいて、 関数を定義するときに、 int a_func(int,x, char*,cp, int**,ypp) { ・・・・ } こんなことをすると、 int b_func(int x, char *cp, int **ypp) { ・・・・ } に置き換わりますか? もし、ARGUMENT3の定義を、ARGUMENT3の後の括弧の中のカンマのつけ方を変えて、 #define ARGUMENT3(t1 v1,t2 v2,t3 v3) ¥ (t1 v1, t2 v2, t3 v3) とし、 int a_func(int x, char* cp, int** ypp) { ・・・・ } こうすると、先ほどのようなb_funcの関数頭部に変換することは出来ませんか? (関数形式マクロでこのような空白の入れ方をしてよいのでしょうか。)

  • c言語で配列を返したい

    自分がc言語で書いているプログラムの関数で次のようなものがあるのですが、 int CTR(int data[], int* key, long long t){ int buf[sizeof(data)]; int tmp[16]; int bytesoft[128]; int i,j; KeyExpansion(key); for(i=0;i<sizeof(data);i+=16){ for(j=0;j<16;j++){ if(j<sizeof(bytesoft)) tmp[16-j-1]=bytesoft[sizeof(bytesoft)-j-1]; else tmp[16-j-1]=0; } Cipher(data); for(j=0;j<16;j++){ buf[i+j] ^= data[i+j]; } t=t+1; } return buf; } 配列bufを返すためには、ポインタを用いればいいということは調べて分かったのですが具体的にどのように書き換えればいいかよくわかりません。 どなたかご教授いただけないでしょうか?

  • Cモジュールが落ちる現象について

    お世話になっております。 現在、C言語でモジュールを作成しているのですが、 下記の関数の箇所でたまにこけるということがわかりました。 この関数のどこでこけているかまでは、判断できていないのですが、 皆様のお力をお貸しいただけないでしょうか。 【ソース概要】 本モジュールはオブジェクトの監視に使用するものなのですが、 設定ファイルより、そのオブジェクトの監視時間帯を確認する関数です。 関数の引数として監視対象オブジェクト名を渡します。 また、本関数を実行するCモジュールは、異なる引数で同時に複数回実行されます。 【設定ファイル内容】 確認日付(曜日) オブジェクト名 監視開始時間1 監視終了時間1 監視開始時間2 監視終了時間2 0415 オブジェクト名 000000 040000 051500 240000   ⇒4月15日はオブジェクトを0時0分0秒から4時0分0秒までと、5時15分00秒から24時00分00秒まで監視する 0 オブジェクト名 000000 040000 051500 240000   ⇒0(日曜日)はオブジェクトを0時0分0秒から4時0分0秒までと、5時15分00秒から24時00分00秒まで監視する 【ソース】 int kansiqmcheck(char Object[256]){ FILE *fp ; time_t t; struct tm *ck_time ; char cktm[5],ckwk[4],line[256],ln[256],mes[512],obj[256] ; int rc=0 , nowtime=0, RC=0 , i ; char *ckdt[6] ; /* 変数初期化など */ memcpy(obj,0,sizeof(obj)); strcpy(obj,Object); memcpy(line,0,sizeof(line)); t=time(NULL); ck_time = localtime(&t); sprintf(cktm,"%02d%02d",ck_time->tm_mon + 1,ck_time->tm_mday); sprintf(ckwk,"%d ",ck_time->tm_wday); strcat(obj," "); for(i=0 ; i < 6 ; i++){ ckdt[i] = NULL; } /* 監視設定ファイルオープン */ if((fp = fopen(CHECKTIMEFILE,"r")) == NULL ){ memcpy(mes,0,sizeof(mes)); sprintf(mes,"%s: CheckTimeFileOpenError:%s" , Targ , CHECKTIMEFILE) ; log_out(mes); exit(1) ; } /* 監視設定ファイルより監視対象オブジェクトの当日の監視に関する情報を取得 */ while(fgets(line,256,fp)!=NULL) { if(strncmp(line,cktm,strlen(cktm)) == 0 && strstr(line,obj) != NULL){ rc=1; break ; }else if(strncmp(line,ckwk,strlen(ckwk)) == 0 && strstr(line,obj) != NULL){ rc=1; break ; } memcpy(line,0,sizeof(line)); } fclose(fp) ; fp = NULL ; /* 監視オブジェクトより、現時刻が監視時間帯に該当するか確認 */ if(strlen(line) > 2 ){ memcpy(ln,0,sizeof(ln)); strncpy(ln,line,strlen(line) - 1 ); i=0; ckdt[i] = strtok(ln," \n\0"); while(ckdt[i] != NULL || i < 6){ i++ ; ckdt[i] = strtok(NULL," \n\0"); } if( i < 2 ){ memcpy(mes,0,sizeof(mes)); sprintf(mes,"%s: CheckTimeInfoError(obj):%s %s %d" , Targ , CHECKTIMEFILE , line , i) ; log_out(mes) ; return; } while(1){ t=time(NULL); ck_time = localtime(&t); nowtime = ck_time->tm_hour * 10000 + ck_time->tm_min * 100 + ck_time->tm_sec ; for( i = 2 ; ckdt[i] != NULL ; i=i+2 ){ if( nowtime > atoi(ckdt[i]) && nowtime < atoi(ckdt[i+1]) ){ rc=0; break ; } } if( nowtime >= atoi(ckdt[i]) && nowtime < atoi(ckdt[i+1]) ){ rc=0; break ; } /* エラーログ確認用 */ if( strcmp(Targ,"ELG") == 0 ){ RC=1; } memcpy(mes,0,sizeof(mes)); sprintf(mes,"%s: 監視スキップ:%s" , Targ , obj ) ; log_out(mes); sleep(10); if(checkstat() != 0 ){ break ; } } } return(RC); }

  • c言語 ハッシュ表

    下のハッシュ表のプログラムについて質問です.関数enterを二回呼び出して,valueの値を変更して表示させても値が更新されません.値が更新せれるにはどうすればよいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASH_SIZE 997 /* ハッシュ表の内部配列のサイズ */ #define HASH_RADIX 97 /* ハッシュ関数用の基数 */ /* ハッシュ表内の連結リストに含まれるノードの構造体 */ struct hash_node { /* ハッシュ表内の連結リストのノード */ char *key; /* キー */ int value; /* キーに対応する値 */ int id; /* キーに付与された通し番号 */ struct hash_node *next; /* 次のノードへのポインタ */ }; typedef struct hash_node HashNode; typedef HashNode *HashNodePtr; /* ハッシュ表の構造体 */ struct hashtable { HashNodePtr *heads; /* 内部配列 */ int serial_id; /* 通し番号管理用の変数 */ int size; /* 内部配列のサイズ */ }; typedef struct hashtable HashTable; typedef HashTable *HashTablePtr; /* 文字列 s のハッシュ値を計算する */ unsigned int hash(char *s) { unsigned int v; v = 0; while (*s != '\0') { v = v * HASH_RADIX + *s; s++; } return v; } /* ハッシュ表を一つ生成し,そのポインタを返す */ HashTablePtr create_hashtable() { HashTablePtr t = NULL; int i; t = malloc(sizeof(HashTable)); t->serial_id = 0; t->size = HASH_SIZE; t->heads = malloc(sizeof(HashNodePtr) * t->size); /* 各連結リストの先頭要素へのポインタは必ず NULL に初期化する */ for (i = 0; i < t->size; i++) { t->heads[i] = NULL; } return t; } /* 指定したポインタ変数に NULL を代入して終わるためのマクロ */ #define delete_hashtable(t) \ (delete_hashtable0(t),t=NULL) /* 実質的な削除作業を行う関数(free 後の NULL 代入は省略)*/ void delete_hashtable0(HashTablePtr t) { HashNodePtr n = NULL, m = NULL; int i; /* 各連結リストの領域を解放 */ for (i = 0; i < t->size; i++) { n = t->heads[i]; while (n != NULL) { m = n; n = n->next; free(m); } } /* 最後に連結リストの先頭ポインタの領域を解放 */ free(t->heads); free(t); } /* ハッシュ表 t に登録されているキーと値のペアの数を返す */ int get_cardinality(HashTablePtr t) { return t->serial_id; } /* ハッシュ表 t にてキー key に対応する値を調べる */ int lookup(HashTablePtr t, char *key) { HashNodePtr n = NULL; int index; /* ハッシュ表の内部配列の添え字を計算 */ index = hash(key) % t->size; /* index 番目の連結リストを先頭から順に走査 */ n = t->heads[index]; while (n != NULL) { /* 引数で指定された key とハッシュ表内のキーが一致したら 直ちに対応する値を返す */ if (strcmp(key, n->key) == 0) return n->value; /* 走査を次に進める */ n = n->next; } /* ここではキーに対応する値は非負であると仮定し, 見つからなかったら -1 を返す */ return -1; } /* キー key と値 value のペアをハッシュ表 t に登録し,その通し番号を返す */ int enter(HashTablePtr t, char *key, int value) { HashNodePtr n = NULL, m = NULL; int index; index = hash(key) % t->size; /* 内部配列の添え字を計算 */ /* キーが既に存在しているかどうかチェック(lookup() と同じ処理)*/ n = t->heads[index]; while (n != NULL) { if (strcmp(key, n->key) == 0) return n->id; /* 通し番号を返す */ n = n->next; } /* 新しいノードを生成 */ m = malloc(sizeof(HashNode)); m->key = _strdup(key); m->id = t->serial_id; m->value = value; /* 連結リストの add_first() と同様にして連結リストに追加 */ m->next = t->heads[index]; t->heads[index] = m; t->serial_id++; /* 次の通し番号に更新 */ return m->id; /* 登録したキーと値のペアに付与された通し番号を返す */ } /* * ハッシュ表 t に登録されるキーの配列を返す *(この配列のサイズは get_cardinality() で取得可能) */ char **get_keys(HashTablePtr t) { char **keys = NULL; HashNodePtr n = NULL; int i; keys = malloc(sizeof(char *) * t->serial_id); /* 各連結リストを走査し,配列に詰め込む */ for (i = 0; i < t->size; i++) { n = t->heads[i]; while (n != NULL) { keys[n->id] = n->key; /* 通し番号を配列添え字に */ n = n->next; } } return keys; /* 後で free() する必要あり */ } void print_hashtable(HashTablePtr t) { printf("Taro => %d\n", lookup(t, "Taro")); } /* ハッシュ表の使用例 */ int main(void) { HashTablePtr t = NULL; t = create_hashtable(); enter(t, "Taro", 25); print_hashtable(t); enter(t, "Taro", 35); print_hashtable(t); delete_hashtable(t); }

  • 現在日時から、任意の時日時を求めるには

    いつもお世話になっています。 いま、現在時刻を取得し、その日付からみて1日前のAM6時へ設定するという処理を作りたいのですが、思うようにできない状態です。 多分、"time(&timer)"で現在時刻を取得し、localtime関数で構造体へ変換してから、値を変更するのだと思うのですが、その部分の処理がうまくできません。 どうかアドバイスをよろしくお願いします。 #include<stdio.h> #include<time.h> void main(){ /* ----------- [ 変数の宣言 ]*/ int i; int sts; int res; time_t timer; time_t ans; struct tm *t_st; /* 現在時刻を取得 */ time( &timer ); t_st = localtime(&timer); t_st->tm_mday - 1; /* ←"コードは意味を持たない"という警告が発生*/ t_st->tm_hour = 6; timer = mktime(t_st); t_st = localtime(&timer); sprintf("%Y/%m/%d %H:%M", -- 以下略 -- }

  • 関数内の変数の扱い方に関する質問です

    Aという関数を作って、メイン関数内の時刻t(0から100)において10おきにplanという変数を変えるプログラムをつくっています。 しかし、メイン関数内の、if(plan == 2){printf("実行\n");}の部分が無視されてしまいます。(関数A内で使ったplanという変数はメイン関数では使えないのですか??)planが2の時に実行と表示させたいのですが、良い方法はありませんでしょうか?どうかよろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int A(int ,int); int main() { int t=0,plan; for(t=0;t<100;t++){ A(t,plan); if(plan == 2){printf("実行\n");} } return 0; } int A(int t,int plan) { if(t % 20 < 10) plan = 1; else plan = 2; }

  • c言語 日付の計算

    現在の日付と未来の日付を入力すると、現在の日付から未来の日付まで何日あるか計算して表示するプログラムを作成せよ。 作成するプログラムの日付の表現は structure st_date { int year; Int month; Int day; }; また、mktime()などの標準ライブラリの時刻、日付関数を使用してはならない。 五時間くらい格闘してますが、私の頭では正直何が何だかわかりませんでした(ー ー;) これのプログラム、また、考え方を教えて頂きたいです(T ^ T)

  • 関数マクロの書き方

    #difine GET_INFO(data) \ do{\ char* addr = topaddr + sizeof(int);\ memcpy(&data,addr,sizeof(int)); \ while(0) 取得さきのメモリのデータ構造は typedef struct _data_t{ int data[2] }data_t data_t test; メモリ上のデータの先頭アドレスはtopaddrとなっている状態で test.data[1] の値を取得する関数マクロの定義としてGET_INFOの書き方は 間違っていますでしょうか?