Предположим, у меня есть функция 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);
}
... Значение '& tr' отправляет адрес _the указателя self_ в функцию и пытается рассматривать это как массив, предназначенный для отказа. Адрес выделенного массива хранится в 'tr', поэтому передайте' tr', а не '& tr'. –
Спасибо, это сработало! Я использую 'void *', потому что я экспериментирую с библиотекой с открытым исходным кодом, и я использую его функцию 'info_callback' для своих целей без значительного редактирования. В зависимости от 'msg' я принимаю решение о том, что' void * 'на самом деле указывает и выполняет некоторые действия. –