上村です。
この話題はあまりこのMLにふさわしくないようですが....
原因は多分変数 t1 のover flow です。
clock_t は long int ですので(私のマシンではですが)4バイトの符号付き
整数です。
t1 が収納できる最大の数は 2147483647 (0x7fffffff) です。
一方、 CLOCKS_PER_SEC は私のマシンでは 1000000 でした。
従ってCPU TIMEが35分位でt1が突然マイナスの値になってしまいます。
符号無しで扱っても71分くらいでover flowしてしまいます。
(2147483647 / 1000000) / 60 = 35
Macでうまくいっているのは多分 CLOCKS_PER_SEC の値がもっと小さいのでは
ないかと思います。
以下のプログラムをMacとLinuxで実行してみて下さい。
#include <time.h>
main()
{
printf("%d %d\n",CLOCKS_PER_SEC,sizeof(clock_t));
}
私のマシンでは
1000000 4
とでます。
それにしても、引用されているプログラムでは無限ループになってしまうと
思われます。多分、コピー&ペーストが誤っているのだと思います。
プログラムのように1字の違いが大変な差になるような話題にカッコが消えて
しまうようなコピー&ペーストは使わないで下さい。
最初に申し上げたように、この話題はこのMLにはふさわしくないと思います。
もし、上記でも解決しないで、かつ、どうしても原因を究明したいというなら、
私宛にMailで連絡をくださるほうがいいかと思います。
Hajime Tanaka wrote:
>
> 上村さん、応答ありがとうございます。
>
> >
> > > if(sscanf(buf, "passed time /sec = %lu", ppass0 < 1
> > > fprintf(stderr, "can't read pass0 ! \n"), exit(1);
> >
> > ほんとにこれでgccを通っているのですか? 左右のカッコの数が合ってないと
> > 思います。
>
> なぜかVineLinux上のエディタからmozillaにテキストをコピー&ペーストできま
> せんで、リブートしたところできるようになったと思いきや、今度はコピー後に"
> ) "が消えてしまいます。気づいた箇所は直したのですが一部漏れ落ちました。失
> 礼を。しかしこのコピー&ペーストのトラブルは頭が痛いです。しかたがないので
> いまはMacで作業しております。
> 先のメールでpassをキャストする点を加えてあらためてソースの時間計測部分の
> みを示します。残念ながら
> pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> としてキャストを行っても依然、時間がおかしいです。ちなみに同一のソースが
> Mac上では異常を見せないことも相変わらずです。どこを疑うべきでしょうか?
>
> ttypedef unsigned long int time_passed;
> (略)
> void Read_tmp(
> const char *filename,
> const char *mode,
> int *pmax_series_set,
> int *pn_series_set,
> set **pseries_set,
> int *pmax_series_record,
> int *pn_series_record,
> int *poptimizesgl,
> record **pseries_record,
> int *pi_series_record,
> set *pnd_set,
> int *pstepmin,
> double *pratiomin,
> double *pep,
> int *pstepsgl,
> int *pstep,
> time_passed *ppass0
> );
> void Read_tmp(
> const char *filename,
> const char *mode,
> int *pmax_series_set,
> int *pn_series_set,
> set **pseries_set,
> int *pmax_series_record,
> int *pn_series_record,
> int *poptimizesgl,
> record **pseries_record,
> int *pi_series_record,
> set *pnd_set,
> int *pstepmin,
> double *pratiomin,
> double *pep,
> int *pstepsgl,
> int *pstep,
> time_passed *ppass0
> ){
> (中略)
> if (NULL == fgets(buf, sizeof(buf), fp)) exit(1); /*ppass0の読み込み*/
> if (sscanf(buf, "passed time /sec = %lu", ppass0) < 1)
> fprintf(stderr, "can't read pass0 ! \n"), exit(1);
> printf("pass0 = %12u\n", *ppass0);
> (中略)
> }
>
> int main()
> {
> (中略)
> clock_t t0, t1;
> time_passed pass, pass0;
> (中略)
> if ('y' == icon){
> Read_tmp(
> "tmp.CDsearch130_b",
> "rb",
> &max_series_set,
> &n_series_set,
> &series_set,
> &max_series_record,
> &n_series_record,
> &optimizesgl,
> &series_record,
> &i_series_record,
> &ndp_set,
> &stepmin,
> &ratiomin,
> &ep,
> &stepsgl,
> &step,
> &pass0
> );
> (中略)
> }
> else{
> (中略)
> pass0 = 0;
> }
> t0 = t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> /*時間計測開始*/
> printf("\n"); printf("***** START ! *****\n");
> for (; ;){
> if (optimizesgl == 0){
> for (; ;){
> for (; ;){
> for (; ;){
> /*時間計測*/
> t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> printf("\n"); printf("passed time = %12u sec\n", pass);
> printf("\n");
> (中略)
> }
> }
> if (i_series_record >= n_series_record){
> /*時間計測*/
> t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> printf("\n"); printf("passed time = %12u sec\n", pass); printf("\n");
>
> (中略)
> }
> }
> }
> if (optimizesgl == 1){
> for (; ;){
> /*時間計測*/
> t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> printf("\n"); printf("passed time = %12u sec\n", pass); printf("\n");
> (中略)
> }
> }
> /*時間計測*/
> t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> printf("\n"); printf("passed time = %12u sec\n", pass); printf("\n");
> (中略)
> } /*計算全体を終了*/
> printf("\nFinished !!\n");
> return 0;
> }
>
> >
> >
> > if(sscanf(buf, "passed time /sec = %lu", ppass0) < 1)
> > fprintf(stderr, "can't read pass0 ! \n"), exit(1);
> >
> > のつもりではないのでしょうか?
> >
> > gccでエラーにならなかったとしたら
> >
> > if(sscanf(buf, "passed time /sec = %lu", ppass0 < 1))
> > fprintf(stderr, "can't read pass0 ! \n"), exit(1);
> >
> > になっているのではないかとおもいますが......
> > この場合多分実行時にエラー(Segmentation fault ?)になると思いますが。
> > 理由は
> >
> > printf("value = %lu\n",ppass0 < 1);
> >
> > で表示される値で表されるアドレスにsscanfの結果を書き込むことになると
> > 思うからです。
> >
> > 間違っていたら、識者の方フォローを宜しく...
> >
> > 尚、変数の定義のあたり、特にppass0の前後も省略しないで書いたほうが
> > アドヴァイスを受けやすいと思います。(原因がそのあたりにあるかも...)
> >
> > --
> > ==================================================
> > 上村 岳明 Gakumei Kamimura
> > E-Mail:kami@xxxxxxxxxxxxxxxxxxx
> > TEL 03-5445-7059 / FAX 03-5445-7071
> > JALインフォテック(株)ソリューション事業本部
>
> --
> 田中 元 BYH01337@xxxxxxxxxxx
--
==================================================
上村 岳明 Gakumei Kamimura
E-Mail:kami@xxxxxxxxxxxxxxxxxxx
TEL 03-5445-7059 / FAX 03-5445-7071
JALインフォテック(株)ソリューション事業本部