~ 仕様 ~
- 引数に、二つの整数(現在と過去)を与える。
- 戻り値として、過去の数値からの増分があればよい。
- 現在の数値は、基本的に過去の数値以上。
- でも、現在の値は64bitで桁あふれして0からリスタートする。
- 2重にループすることは考慮しなくてよい
開発用Linux上なので、php でも c でも perl でも、その他、動けばOKです。
単純な計算だからとシェルスクリプトで64bitを計算しようとして、32bit OSとしての、仕様の壁にぶちあたりました。
snmp v2c 侮りがたし…
引数というのはコマンド引数のことだったんですね。
じゃあ、手っ取り早く Ruby で。
#!/usr/local/bin/ruby def put_usage puts "Usage: #{$0} old_time new_time" end def cal_diff_time(old_time, new_time) if new_time >= old_time return new_time - old_time else return new_time + (2 ** 64 - old_time) end end if ARGV.size != 2 put_usage exit 1 end old_time = ARGV[0].to_i new_time = ARGV[1].to_i diff_time = cal_diff_time(old_time, new_time) puts diff_time
C99 の場合:
#include <stdint.h> #include <inttypes.h> #include <stdio.h> uint_least64_t calc_diff_time(uint_least64_t old_time, uint_least64_t new_time) { if ( new_time >= old_time ) { return new_time - old_time; } else { return new_time + (UINT_LEAST64_MAX - old_time); } } int main() { uint_least64_t old_time = 1, new_time = 0; uint_least64_t diff_time = calc_diff_time(old_time, new_time); printf("diff time = %" PRIuLEAST64 "\n", diff_time); return 0; }
ありがとうござますm(__)m
# vi hoge.c
(コピペ)
# gcc hoge.c
# ./a.out 1 1
diff time = 18446744073709551614
ソースをよく見直してみると、引数は自分で書き直さないとですね(^_^;
う~む…
C は苦手… orz
引数というのはコマンド引数のことだったんですね。
じゃあ、手っ取り早く Ruby で。
#!/usr/local/bin/ruby def put_usage puts "Usage: #{$0} old_time new_time" end def cal_diff_time(old_time, new_time) if new_time >= old_time return new_time - old_time else return new_time + (2 ** 64 - old_time) end end if ARGV.size != 2 put_usage exit 1 end old_time = ARGV[0].to_i new_time = ARGV[1].to_i diff_time = cal_diff_time(old_time, new_time) puts diff_time
実行してみました。
求めていた動作でした、本当にありがとうございます。
環境にrubyがなくて、あわててrpmインストールしましたがw
Bシェルにどっぷりハマりすぎてましたね…反省です。
実行してみました。
求めていた動作でした、本当にありがとうございます。
環境にrubyがなくて、あわててrpmインストールしましたがw
Bシェルにどっぷりハマりすぎてましたね…反省です。