2016-07-13 2 views
0

Предположим, у меня есть функция calc_sum(), и я хочу измерить время ее выполнения. У меня есть функция обратного вызова info_callback(), которая печатает сообщение и вычисляет время выполнения, оно принимает указатель void как параметр. Я хочу передать void* в struct timeval *, чтобы получить начало/конец времени выполнения и вычислить разницу, но я не могу понять, как передать указатель на массив struct timeval *, чтобы я мог получить доступ к его элементам с помощью функции info_callback(). Что бы я ни пытался, я получаю ошибку сегментации ...Передайте указатель void как параметр функции и отбросите его на массив timeval

Как передать и наложить указатели, чтобы заставить его работать?

EDIT: исправлена ​​ошибка в коде, как 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

Вы должны пройти tr в info_callback вместо &tr. tr указывает на выделенный вами массив; &tr - указатель к указателю tr.

Кстати, какая-либо конкретная причина для использования void * вместо фактического типа? Если вы использовали фактический тип, компилятор отметил бы это.

+0

... Значение '& tr' отправляет адрес _the указателя self_ в функцию и пытается рассматривать это как массив, предназначенный для отказа. Адрес выделенного массива хранится в 'tr', поэтому передайте' tr', а не '& tr'. –

+0

Спасибо, это сработало! Я использую 'void *', потому что я экспериментирую с библиотекой с открытым исходным кодом, и я использую его функцию 'info_callback' для своих целей без значительного редактирования. В зависимости от 'msg' я принимаю решение о том, что' void * 'на самом деле указывает и выполняет некоторые действия. –

 Смежные вопросы

  • Нет связанных вопросов^_^