编辑:感谢到目前为止的答案,至少我现在可以编译它,但我仍然遇到分段错误。
对于编译,我使用以下行:
gcc -g -O0 -I../include -L../ test.c -static -lrt
源代码如下:
#include <sys/time.h>
#include <time.h>
#include <stdio.h>
struct timespec *diff(struct timespec *start, struct timespec *end);
int main()
{
struct timespec time1, time2;
int i;
int temp = 0;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for (i = 0; i< 242000000; i++)
temp+=temp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
printf("sec: %d, nsec: %f",diff(&time1,&time2)->tv_sec, diff(&time1,&time2)->tv_nsec);
//cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
return 0;
}
struct timespec *diff(struct timespec *start, struct timespec *end)
{
struct timespec *temp;
if ((end->tv_nsec-start->tv_nsec)<0) {
temp->tv_sec = end->tv_sec-start->tv_sec-1;
temp->tv_nsec = 1000000000+end->tv_nsec-start->tv_nsec;
} else {
temp->tv_sec = end->tv_sec-start->tv_sec;
temp->tv_nsec = end->tv_nsec-start->tv_nsec;
}
return temp;
}
我现在收到以下警告:
test.c: In function ‘main’:
test.c:17: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘__time_t’
test.c:17: warning: format ‘%f’ expects type ‘double’, but argument 3 has type ‘long int’
分割错误肯定是由我对结构的处理引起的。很久以前,我最后不得不与C打交道。
非常感谢,
马库斯
最佳答案
diff函数的签名为timespec diff(timespec start, timespec end)
,其中应为struct timespec diff(struct timespec start, struct timespec end)
。
编辑
您的diff函数正在分配给未初始化的struct指针,您可能需要将其更改为类似于以下内容的指针。
void diff(struct timespec *start, struct timespec *end,
struct timespec *result);
int main()
{
struct timespec time1, time2, result;
int i;
int temp = 0;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for (i = 0; i< 242000000; i++)
temp+=temp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
diff(&time1, &time2, &result);
printf("sec: %ld, nsec: %ld", (long int)result.tv_sec,
(long int)result.tv_nsec);
return 0;
}
void diff(struct timespec *start, struct timespec *end,
struct timespec * result)
{
if ((end->tv_nsec-start->tv_nsec)<0) {
result->tv_sec = end->tv_sec-start->tv_sec-1;
result->tv_nsec = 1000000000+end->tv_nsec-start->tv_nsec;
} else {
result->tv_sec = end->tv_sec-start->tv_sec;
result->tv_nsec = end->tv_nsec-start->tv_nsec;
}
}