0

我一直在阅读这个主题。我已经阅读了很多可能的解决方案,所以请不要将我的问题标记为重复,只需要这个问题的正确解决方案。

我有一个计算某些代码执行时间的函数。此代码将作为参数发送(将是一个函数)。

这是计算时间的函数:

double executionTime( /* HERE I WANNA PASS THE FUNCTION TO CALCULATE EXECTIME*/ )
{
    LARGE_INTEGER frequency;
    LARGE_INTEGER start;
    LARGE_INTEGER end;
    double interval;

    QueryPerformanceFrequency(&frequency);
    QueryPerformanceCounter(&start);

    // HERE GOES CODE TO PROCCESS

    QueryPerformanceCounter(&end);
    interval = (double) (end.QuadPart - start.QuadPart) / frequency.QuadPart;

    return (interval);
}

我试过这个(和其他方法,但它是最明显的):

double executionTime( void (*f)() )
{
    LARGE_INTEGER frequency;
    LARGE_INTEGER start;
    LARGE_INTEGER end;
    double interval;

    QueryPerformanceFrequency(&frequency);
    QueryPerformanceCounter(&start);

    // Function to proccess
    f();

    QueryPerformanceCounter(&end);
    interval = (double) (end.QuadPart - start.QuadPart) / frequency.QuadPart;

    return (interval);
}

我不知道处理函数的参数是否重要。在一些网站上说是,在另一个网站上说不是。我要处理的函数的声明是:

int readFileAndInsertRegs(char *nombreFichero, PERSONA *tablaHash[], int tam, int tipoInsertado, int tipoPruebaColision) 

我调用了executionTime如下函数:

executionTime( readFileAndInsertRegs("./files/listaActores.csv", &tablaHash, TAM_E1, NORMAL, LINEAL) );

谁能帮我解决这个特殊问题?

谢谢你。

4

1 回答 1

2

通常这样做的方法是将函数参数传递给executionTime并用它们调用函数,即

double executionTime( void (*f)(), char *arg1, PERSONE arg2[], ... )
{
    // do preamble

     f(arg1, arg2, .....);

    // finish
}

...

executionTime( &readFileAndInsertRegs, "./files/listaActores.csv", &tablaHash, TAM_E1, NORMAL, LINEAL));

这是一个工作示例:

#include <stdio.h>

void process1(void (*f)(), int farg) {
  f(farg);
}

void f1(int arg) {
  printf("f1: %d\n", arg);
}

int main() {
  process1(&f1, 10);
  return 0;
}

并且,在“c”中,您不需要声明函数的所有参数,尽管可以,这样做是个好主意。编译器可以进行额外的检查

    void process1(void (*f)(int), int farg) {
于 2018-10-13T01:53:55.207 回答