2016-07-13 84 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 *'实际指向什么并执行一些操作。 –

相关问题