上村です。 この話題はあまりこの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インフォテック(株)ソリューション事業本部