2010-01-27 209 views
3

編輯:感謝迄今爲止的答案,至少我現在可以編譯它,但我仍然得到一個分割錯誤。什麼是導致此C代碼中的段錯誤錯誤?

編譯我用下面的一行:

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 ....

非常感謝, 馬庫斯

+0

嘗試運行'gcc -C -E foo.c'並查看timespec結構是如何定義的,如果它定義的話。至少在Cygwin上,我只有'timeval',沒有'timespec'。 – csl 2010-01-27 15:03:03

+0

也添加到編譯器選項。 GCC會告訴你問題是什麼:) – 2010-01-27 16:40:10

回答

3

讓diff函數的簽名爲timespec diff(timespec start, timespec end),它應該是struct timespec diff(struct timespec start, struct timespec end)


編輯 你DIFF功能分配給未初始化的結構指針,你可能需要將其更改爲類似以下內容。

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; 
    } 
} 
+0

謝謝,它現在至少編譯。剩下的唯一問題是輸出值是0秒和0.00000納秒。這肯定是錯誤的... – Marcus 2010-01-27 15:17:58

+1

@Marcus:確保你的printf是正確的 - 如果你使用%f而不是%ld,你會得到0.0000而不是正確的值 – 2010-01-27 17:00:10

0

您必須在timespec之前添加struct關鍵字。例如。

struct timespec diff(struct timespec start, struct timespec end); 
0

您編譯它爲C(gcc.c擴展),但看起來你是在C++(其中struct可以聲明變量時承諾)編碼。

此外,在C我們通常不按值傳遞結構。

另一個提示是要始終以高警告級別進行編譯,至少-Wall -pedantic,以便及早發現問題。

0

我想你想DIFF()返回無論是動態或靜態分配的指針。

嘗試(在意見建議):

struct timespec *diff(struct timespec *start, struct timespec *end) 
{ 
struct timespec *temp; 

/* allocate temp to be sizeof(struct timespec) and zero it out */ 
temp = malloc(sizeof(struct timespec)); 
/* Of course, deal with malloc (or calloc) failing */ 
memset(tmp, 0, sizeof(struct timespec)); 

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; 
/* Make sure caller frees the returned pointer */ 
} 

如果動態分配是大忌,那麼:

static struct timespec temp; 
/*zero it out, watch concurrency too! */ 

.... 

temp.tv_sec = end->tv_sec-start->tv_sec; 
/* Make sure caller does NOT free (or modify) the pointer */ 
return temp; 

你需要返回一個指針那裏(但是分配的),實際上可以通過達成呼叫者,召集者。或者,使* temp全球。

3

根據您的需求,你可能只是想生成所經過的時間是這樣的:

double t_ns = (double)(end.tv_sec - start.tv_sec) * 1.0e9 + (double)(end.tv_nsec - start.tv_nsec); // get elapsed time in ns

此外,FWIW,我用CLOCK_PROCESS_CPUTIME_ID - 這似乎給在各種Linux更好的精度和分辨率

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

// ... stuff ... //

:我已經試過了基於上系統

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);