Đối với đoạn mã sau, đôi khi tôi nhận được các giá trị âm. Tôi không hiểu nó. Bất cứ ai có thể giải thích tại sao điều này xảy ra.
int64_t gettimelocal()
{
cấu trúc thời gian Thời gian;
if(-1 == gettimeofday(&Time,NULL))
{
perror("gettimeofday");
}
// lấy thời gian tính bằng micro giây
return ((Time.tv_sec * 1000000) + Time.tc_usec);
}
Để đảm bảo an toàn bạn nên khởi tạoThời gian
. khithời gian trong ngày
Khi thất bại, bạn nênlỗi lầm
Trở lại sau. Vì vậy hãy thử:
int64_t gettimelocal() {
cấu trúc thời gian Thời gian = {0,0};
if(-1 == gettimeofday(&Time,NULL)) {
perror("gettimeofday");
return -1;
}
// lấy thời gian tính bằng micro giây
return (((int64_t)Time.tv_sec * 1000000) + Time.tv_usec);
}
Cuối cùng, bạn có chắc chắn phép nhân sẽ không bị tràn không? Bạn cần truyền để đảm bảo phép nhân được thực hiện trong 64 bit.
Trong thực tế, tôi khuyên bạn nên sử dụng gấp đôi
float clock_gettime(3)Như thế này:
nội tuyến tĩnh gấp đôi my_clock_time (clockid_t cid) {
struct timespec ts = { 0, 0 };
if (clock_gettime (cid, &ts))
trả về NAN;
khác
return (gấp đôi) ts.tv_sec + 1.0e-9 * ts.tv_nsec;
}
và sau đó gọimy_clock_time(CLOCK_REALTIME)
printf ("bây giờ %.5f\n", my_clock_time(CLOCK_REALTIME));
Đọc kỹ thời gian(7) .Đừng mong đợi độ chính xác nano giây!
Biên dịch mã của bạn với tất cả thông tin cảnh báo và gỡ lỗi (ví dụ: gcc -Tường -g
). Sử dụng trình gỡ lỗi (gdb
), và có lẽ cũng sử dụng dấu vết(1)
Tôi là một lập trình viên xuất sắc, rất giỏi!