- - PR -
C の localtime() の引数は混乱を招く。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-09-29 21:58
ども、ほむらです。
気づいたら長文になっていました。。。 -------- コブラ氏 >こうしないのは、コンパイラのパディングを予想してという理由だけなのでしょうか? >それとも他に何か私の思いもよらない理由があるのでしょうか? そんなに深い理由があるわけではありませんが 今は昔、僕がまだプログラムをしていた時代。。。 データを固定長のバイナリとして持っていたわけです。 これを読み込むときに便利なのが構造体。 でもってちょっとだけ違う構造体もあるわけで。。。。
これがなぜ安全なのかというのは メモリダンプ(orファイル出力 バイナリエディタで閲覧等)を見てもらうと良いと思います。 intel系と指定した理由も同じくです。 全く異なる型への安全な(?)キャストができるから継承っぽいことと表現しただけです まぁたんに無理矢理出しただけの例ですのであまり気にしなくてもいいと思います。 便利だけど破綻しやい危険な使い方であるのも確かですから。。 知識として持ってるだけで十分かと。。。 | ||||||||
|
投稿日時: 2004-09-29 22:41
コブラさんって、もともとWindows系なのかな?Windowsのライブラリって、APIの中で領域確保して、「呼び出し側で解放してくれ」ってのが多いですね。
対して、POSIX準拠?UNIX系には、そういう関数は滅多にないような? | ||||||||
|
投稿日時: 2004-09-30 02:23
全然良く分からずに書いてるんで思いっきり外してるかもしれませんが、 struct tm *localtime_s(time_t timer) { return localtime(&timer); } とか struct tm localtime_s(time_t timer) { return *localtime(&timer); } したらいいとか、そういう話ではない? | ||||||||
|
投稿日時: 2004-09-30 23:25
そういう話でいいと思います。 私もやるならこれですね。 時間の計算の実装を自分でやることはこのスレッドの目的ではないですから。。 | ||||||||
|
投稿日時: 2004-10-01 13:32
いやぁ〜、いっぺん unix-C やって、そっから LPCTSTR だらけの VC++ に移って、
そっからまた gcc に・・・ 一度身に着いたモノを捨てんと、また同じ失敗を やらかしてしまいます(笑) > Jitta氏 なちゃ氏: 勿論、考えましたそれ。 何ちゅぅか、まぁせっかく「自分用の関数を作れ」とおっしゃってるのだから(笑) ほむら氏のソースを拡張してます。 ちょっと見ただけでは、 「こ、この構造体の入れ子の深さは・・・」 ちょっとレベルが高過ぎて躊躇してしまいますので、実際に動きを確かめながら 理解するようにします。 ただ、Location をスーパークラスと見立てて、スーパークラス Location を 呼び出す 子クラス Sprite, 子クラス Sprite を呼び出す孫クラス Sprite1, Sprite2 こう考えると、確かに Sprite1 から スーパークラスの Location のメンバー にアクセスできますね。つまり、自分自身の実装以外に、親クラスの属性・メソッドを 呼び出せる、、継承できると認識しました。 後、私自身が感じた「肝」の部分は、 get_intersect() の第二引数以降で、 定義した型を強制的にキャストで型変換しておられます。 ここが、私がかつて見たことが無い事をしておられるので非常に興味深い。 っちゅぅか、初めて見た時「こんな事できんのか?」と思いましたが、 実際は、コンパイラのキャストの Warning 2個ぐらいだけでしたね。。。(笑) こういう発想・実装ができるようになりたいもんです。 | ||||||||
|
投稿日時: 2004-10-04 16:31
いやー、「どうやってインターフェースもどきを実現しようか・・・」と、かなり考えて
やっと、それらしきモノになりました。まぁ、あくまで「もどき」ですが。。。 これまで、ここで学んできた事を、自分なりに応用して造ってますが、これを自分で コントロールするのは、私にはまだ荷が重い (プ ソースは二つに分かれてます。 super.c
以上が呼び出され側。 呼び出し側 sub.c
コンパイル: gcc -o sub -O sub.c スーパークラスのメソッドとインターフェースの実装部分の違いが明らかになるように しました。。。と思たら、これメンバーに対する具体的な値やのぅて、 struct に 対して malloc しとるからダブルポインタはお門違いでした。 又しても Solaris の「堅さ(?)」にやられてしまいました。 Linux ではメモリアクセス 違反が発生・・・Solaris では何故か動きます。 修正しました。 Warning は取れました。 しかし、オーバーライドはどうしても実現できない。 [ メッセージ編集済み 編集者: コブラ 編集日時 2004-11-11 14:47 ] [ メッセージ編集済み 編集者: コブラ 編集日時 2004-11-11 14:50 ] | ||||||||
|
投稿日時: 2004-10-04 16:51
localtime(); 自作するのに、ここまでやらなアカンとは・・・
ぶっちゃけ、前の localtime_s() の if(d == 0.000) d = 1.000; これは、 if(d > 0.000 && d < 1.000) d = 1.000; こう変えんとマトモに動きませんな(笑) 後、色々変更。また変更するかも (プ
[ メッセージ編集済み 編集者: コブラ 編集日時 2005-05-02 14:07 ] | ||||||||
|
投稿日時: 2004-11-11 15:04
ドメインと役割の対応を見直しました。
super.c
sub.c
ソースが読み難くなってきたので、もうこれが最期です。 [ メッセージ編集済み 編集者: コブラ 編集日時 2005-04-04 18:02 ] |