- PR -

C の localtime() の引数は混乱を招く。

投稿者投稿内容
Toshi
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 62
投稿日時: 2004-09-11 23:48
引用:

ぽんすさんの書き込み (2004-09-11 01:02) より:
引用:

c標準ライブラリの規定ってどこで見られるかご存知ですか?


う〜ん...
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-11.html
に書いてあるあたりでしょうか。
JIS の規格書は大学や研究機関の図書館に置いてあったりしますね。


JISは
http://www.jisc.go.jp
のJIS検索からJIS規格名称検索から「プログラム言語」をキーに検索すると閲覧できます。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-09-12 02:37
引用:

Toshiさんの書き込み (2004-09-11 23:48) より:
JISは
http://www.jisc.go.jp
のJIS検索からJIS規格名称検索から「プログラム言語」をキーに検索すると閲覧できます。


やってみました。
これ、いいですね
ISO とか ITU とかだと、タダ読みは出来なかったりめんどくさかったり
しますので...
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-09-15 17:11
引用:

JISは
http://www.jisc.go.jp
のJIS検索からJIS規格名称検索から「プログラム言語」をキーに検索すると閲覧できます。



ありがとうございます。参考になります。

上のJIS規格によると,
time_tは時刻を表すことができる算術型
となっているので、

引用:

Ancient Unix でカレンダー時刻を格納していたのが int time[2]
であったことの名残ではないかと思います。



int time[2]
は、規格外ということでしょうか。。
intの配列は"算術型"ではないと思うのですが。

C言語講座みたいになってしまってすいません 
未記入
会議室デビュー日: 2004/09/18
投稿数: 4
投稿日時: 2004-09-18 04:29
コブラさん

サンプルコードを書いてみました。
これなら関数の中でmallocして、関数の外でfreeできますよ。
参考になれば幸いです。

あと、開発中のgccのオプションは
gcc -g -Wall -ansi -pedantic -O0
あたりがおすすめですよ。

splintを使うなら
splint -weak *.c
くらいがいいと思います。

※サンプルなんで結構適当です
コード:
#include <stdio.h>
#include <stdlib.h>

static void foo(char** const pp);

int main(void)
{
	char* p;
	
	foo(&p);
	(void)printf("%c\n",*p);
	free(p);
	p = (char*)NULL;
	return 0;	
}
static void foo(char** const pp)
{
	if(pp){
		*pp = (char*)malloc(sizeof(char));
		if(*pp){
			**pp = 'A';
		}
	}
}

ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-09-18 19:55
引用:

ナキヲさんの書き込み (2004-09-15 17:11) より:
int time[2]
は、規格外ということでしょうか。。
intの配列は"算術型"ではないと思うのですが。


この頃の C では厳密な型チェックは行われず、キャスト演算子も
存在しなかったような仕様であることがポイントと思うですよ。

てゆーか、time_t型は ANSI C で出てきたものだろうと思います。
手元には K&R 第1版も無いので確かなところは分かりませんが...

NetBSD で man 3 time してみると、time 関数のほうは Version 6 で
すでに存在していたようです。
Version 6 において、time 関数を実装するのに利用できそうな
システムコールは gtime() くらいで、それは
コード:
gtime()
{

    u.u_ar0[R0] = time[0];
    u.u_ar0[R1] = time[1];
}


というものです。
ここで、u はuser構造体で、メンバ u_ar0 は
int *u_ar0 として定義されています。
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-09-18 20:21
引用:

Ancient Unix でカレンダー時刻を格納していたのが int time[2]
であったことの名残ではないかと思います。



今読み直して、勘違いしていたことに気づきました。
さっと読んで、
"time_tをint[2]と定義しているものがある"と
書かれていたと記憶していました。
すいません。

私がCを勉強しばじめたときにはもうK&Rの第2版が
出ていたので、ANSI C以前のことについては
正直言って疎いです…。
歴史的経緯を知るといろいろわかって面白いですね。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-18 21:21
おぉぉぉっ!!

素直に func(p); とやってしまうと、ポインタ型とポインタへのポインタ型で
「互換性が違う」と通常は怒られますが、ここでポインタに & 付けるとは・・・
この使い方は初めて見ます。これは、余り教科書に載ってない。

ポインタへのポインタはスタックフレーム外からの free(); を可能にする。。。

こういう具体的でシンプルなコード、レベルアップにかなり役立ちます。
助かります>未記入氏

もうちょっと自分でいじくってみます。

>gcc -g -Wall -ansi -pedantic -O0

このチェックは厳しい!
マジ厳しい(笑)
インクルード・ライブラリの定数、関数に対して厳しい指摘が・・・
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-09-18 22:21
引用:

素直に func(p); とやってしまうと、ポインタ型とポインタへのポインタ型で
「互換性が違う」と通常は怒られますが、ここでポインタに & 付けるとは・・・
この使い方は初めて見ます。これは、余り教科書に載ってない。


ポインタに&を付けると言うより、ポインタ型変数のポインタを渡してるって事ですね。
ポインタ型の変数もあくまで普通の変数に違いありませんから。

スキルアップ/キャリアアップ(JOB@IT)