2016-07-13 120 views
0

假設我有一個函數calc_sum()並且我想測量它的執行時間。我有一個回調函數info_callback(),它打印一條消息並計算執行時間,它將void指針作爲參數。我想要void*struct timeval *來檢索開始/結束執行時間並計算差異,但我不明白如何將指針傳遞給數組struct timeval *,以便我可以從info_callback()函數中訪問其元素。 無論我嘗試,我得到分段錯誤...傳遞void指針作爲函數參數並將其轉換爲timeval數組

我應該如何傳遞和投射指針才能使它工作?

編輯:在代碼固定誤差爲Andy Schweig建議

#include <stdio.h> 
#include <sys/time.h> 

void calc_sum(int a, int b) 
{ 
    int k = a + b; 
    printf("sum = %d\n", k); 
} 

void info_callback(const char *msg, void *client_data) 
{ 
    struct timeval *t = (struct timeval *) client_data; 
    double time = (t[1].tv_sec - t[0].tv_sec) * 1000.0; // !!!SEGMENTATION FAULT!!! 
    time += (t[1].tv_usec - t[0].tv_usec)/1000.0; // 

    printf("[TIME] %s: %f, ms", msg, time); 
} 

int main(int argc, char *argv[]) 
{ 
    struct timeval t1, t2; 
    gettimeofday(&t1, NULL); 

    calc_sum(2, 3); 

    gettimeofday(&t2, NULL); 

    struct timeval * tr = (struct timeval*) malloc(2 * sizeof(struct timeval)); 
    tr[0] = t1; 
    tr[1] = t2; 

    double time = (tr[1].tv_sec - tr[0].tv_sec) * 1000.0; // sec to ms 
    time += (tr[1].tv_usec - tr[0].tv_usec)/1000.0; // us to ms 

    printf("time = %f, ms\n", time); 

    info_callback("Execution time", tr); 
    free(tr); 
} 

回答

1

你應該通過trinfo_callback而不是&trtr指向您分配的數組; &tr是指向指針tr的指針。

順便說一下,使用void *而不是實際類型的任何特定原因?如果您使用了實際的類型,編譯器會標記這個。

+0

...意義'&tr'將_指針本身_的地址發送給該函數,並試圖將其視爲數組註定的失敗。分配數組的地址存儲在'tr'中,因此傳遞'tr',而不是'&tr'。 –

+0

謝謝,這工作!我使用'void *'是因爲我正在試驗一個開源庫,並且爲了我自己的目的使用它的'info_callback'函數而不用編輯太多。根據'msg',我決定'void *'實際指向什麼並執行一些操作。 –

相關問題