人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

次の仕様を満たすプログラムを教えていただけますか?

? 仕様 ?
- 引数に、二つの整数(現在と過去)を与える。
- 戻り値として、過去の数値からの増分があればよい。
- 現在の数値は、基本的に過去の数値以上。
- でも、現在の値は64bitで桁あふれして0からリスタートする。
- 2重にループすることは考慮しなくてよい

開発用Linux上なので、php でも c でも perl でも、その他、動けばOKです。
単純な計算だからとシェルスクリプトで64bitを計算しようとして、32bit OSとしての、仕様の壁にぶちあたりました。
snmp v2c 侮りがたし…

●質問者: 黒猫
●カテゴリ:コンピュータ
✍キーワード:Linux OS Perl PHP SNMP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● しおり
●50ポイント

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


2 ● しおり
●450ポイント ベストアンサー

引数というのはコマンド引数のことだったんですね。

じゃあ、手っ取り早く 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シェルにどっぷりハマりすぎてましたね…反省です。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ