- PR -

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

投稿者投稿内容
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2004-09-10 13:48
自分でコーディングしたコードの何処に問題が有るかを
自分でデバッグもしない上に結局人に教えてもらった
コードで解決したからといってそれで良しとし、

さらにSolarisとLinuxが100%コンパチでないのに
結果が違う事について自分で調べようともせずに

あげくの果てに言語仕様にまで文句を付けている様な
人間に他人を批判する資格は無いです。

本当に自分でコーディングされているのですか?
自分でコーディングしているならば
問題になっている点なんて特定できるはずです。

また「プ」とか書くのも知っている限りでは
貴方だけです。技術者としてどうかと思いますが。

一から出直してくる事を勧めます。
タコツボ
常連さん
会議室デビュー日: 2004/01/20
投稿数: 22
お住まい・勤務地: 京都・大阪
投稿日時: 2004-09-10 13:50
タコツボです。

引用:

コブラさんの書き込み (2004-09-10 13:36) より:
UT氏:
>const型のポインタに確保していない領域のアドレスの渡してあげても、
>渡された関数はこの領域に対して基本的にはなにもできません。

たこつぼ氏:
>const修飾子は、ただ単に呼ばれた側の関数(今回の例で言えばlocaltime)の
>中で値を変更しない、参照のみである、ということを意味しているだけで、

UT氏:
>このようなアドレスを渡すことに意味は無いわけです。

たこつぼ氏:
>ocaltimeの中から確保されていない領域のアドレスを参照に行くということは
>即ち意味の無い値を見に行くことになるわけで、

俺には、二人が全く同じ事を言ってるように見えるんやが・・・


私が言いたかったのは、
引用:

UTさんの書き込み (2004-09-09 20:05) より:
ポインタ引数の領域を確保するべきか、するべきじゃないかを判断する指針に
const型か非const型かがあるとおもいます。


この部分に対して、constの有無を領域を確保するための指針にするのはまずいのではないかということでして、領域を確保しないことが意味が無いだけならまだしも、(例によって運次第で)セグメンテーション・フォルトになりますよ、ということです。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-10 14:10
>それがいやなら、自分で作ればいいだけのことです。

なるほど。これは解る。
確かに、自分で作れば良いな。

しかし、池の周りにフェンスを張っとくのと、そのまま放置して好きにさせるのとでは
死亡率が明らかに変わってくるんちゃうかとも思いますが。>ナキヲ


-------------------------------------------------------------------------
で、Solaris の gcc も RedHat の gcc も「コンパイラー」という機能については
どっちも遜色無いんちゃうんか? 仮に予測した結果と違えば同じになるように
努力するやろ普通 (ププ

>また「プ」とか書くのも知っている限りでは
>貴方だけです。技術者としてどうかと思いますが。

だから、お前の居る世界は「狭い」と言われるのだ (プ

>本当に自分でコーディングされているのですか?

アホか。
こんな出来の悪いコード俺が書く訳無いやろっ (爆)

お前が、脳内妄想でソースレベルの問題に矮小化しとる限り根本的な解決は遠いな。

つまり、一つは
「何故トラブルになり易いような値の渡し方をするのか」
もう一つは
「何故 gcc で二つの異なる結果が出るのか」


>コードで解決したからといってそれで良しとし、

ホンマにこれが正しいとすれば、このスレッドは立たんかったやろな。
人生やり直すには、もう手遅れやろけど (オプ
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-10 14:23
あぁ、やっと意味が判りました>たこつぼ氏
不定アドレスなら const も 非 const も関係無いと・・・落ちまっせと。

const で受けるべき引数を持つ関数があったとして、そいつに不定アドレス渡しても
コンパイルエラーは出んのですかね。。。出てくれたら、まぁ、一つの予防策なんかな、
とも思いますが。

記憶によると、昔の C に const 無かったんで、これは C++ に限った事か?
とも思とる訳ですが・・・
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-10 14:37
>ここはウソですよ。gettimeofday() は引数として渡されるポインタ変数の値は設定
>しません。(特にこの関数に限った話ではありませんが)
>疑わしいと思われたら、宣言直後、および gettimeofday() の前後で第一引数の値を
>表示させてみてください。

確かに、初期化してないポインタ変数やと localtime(); の前で落ちますな、これ。
実体の変数渡したら動いて当たり前・・・ん〜

確かに、gettimeofday() の第一引数で必ずしも値が設定されるとは限りませんな。
失礼しました。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2004-09-10 15:17
C++のコンパイルでOSによって結果が異なるで、

引用:

私のコーディングが甘かった。
RedHatの gcc3.2.2 は極めて正常な振る舞いをしておりました。


とか書いていたのは何処のどなたですかね?

引用:

アホか。
こんな出来の悪いコード俺が書く訳無いやろっ (爆)


書いてるじゃないですか。

引用:

自分でコーディングしたコードの何処に問題が有るかを
自分でデバッグもしない上に結局人に教えてもらった
コードで解決したからといってそれで良しとし、



は上のスレッドの流れを見ればそうですよね?

引用:

ソースをこんな風に、「スタンダード・テンプレート」?を使わないように printf と
scanf で代用するようにしたら問題は解消されました。

今後も、 C++ でプログラミングする場合、この様な移植作業も念頭に置いて作業しなければ
ならないのでしょうか?

全く訳が判りません。



と質問していましたよね?
この質問内容を見るならばprintfとscanfを使えば?と言う回答になるでしょう?
何処が違うか解らないので有れば、「このプログラムで間違い有りませんか?」
と質問すれば良いと思いますが。

引用:

お前が、脳内妄想でソースレベルの問題に矮小化しとる限り根本的な解決は遠いな。


システムの違いを意識しない人間に言われたくないですね。(^_^;
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-09-10 15:25
こんな環境でちょっと試してみました。

$ cygcheck -cd gcc gcc-g++
Cygwin Package Information
Package Version
gcc 3.3.3-3
gcc-g++ 3.3.3-3


p.c ... 未初期化のvoid*の値をいろいろな状況で表示してみる。
コード:
 #include <stdio.h>
 #include <stdlib.h>
 
 static void
 print_unassigned_pointer() {
 	void *p;
 	printf("print_unassigned_pointer=%p\n", p);
 }
 
 void
 print_unassigned_pointer_with_one_args(int dummy) {
 	int a;
 	void *p;
 	printf("print_unassigned_pointer_with_one_args=%p\n", p);
 }
 
 int
 main(int argc, char *argv[]) {
 	void *p;
 	printf("main %p\n", p);
 
 	print_unassigned_pointer();
 	print_unassigned_pointer_with_one_args(1);
 	print_unassigned_pointer();
 
 	return EXIT_SUCCESS;
 }



コンパイラのオプションを変えて試してみると:
(オプションは gcc 1.65 のころに使ったものをうろ覚えて試しただけなので、
突っ込まないでください)

$ gcc -Wall -o p p.c
(略)
$ ./p
main 0x4
print_unassigned_pointer=0x9
print_unassigned_pointer_with_one_args=0x0
print_unassigned_pointer=0x9

$ gcc -Wall -O -o p p.c (最適化)
(略)
$ ./p
main 0x4
print_unassigned_pointer=0x9
print_unassigned_pointer_with_one_args=0x1d
print_unassigned_pointer=0x2c

$ gcc -Wall --omit-frame-pointer -o p p.c (フレームポインタを抑制)
(略)
$ ./p
main 0x4
print_unassigned_pointer=0x4
print_unassigned_pointer_with_one_args=0x4
print_unassigned_pointer=0x4
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-09-10 16:07
CコンパイラやC++コンパイラの挙動が、
標準規格に100%のっとっていて、
全て同じ挙動をするのが理想ですが、
実際そうではないことはご存知でしょう。<コブラ

仕様上"結果は未定義"なんてのもありますし。。
処理系によって結果が異なる場合も存在します。

前にも書きましたが、
いやなら自分で作ればよいわけで。

自分の思うような挙動をする、コンパイラやOSを作って、
世界標準にすればいいんじゃないですか。

あなた程の技術者であれば可能でしょう(プ

[ メッセージ編集済み 編集者: ナキヲ 編集日時 2004-09-10 16:10 ]

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