代码之家  ›  专栏  ›  技术社区  ›  JuMoGar

将函数作为参数传递给其他函数

  •  0
  • JuMoGar  · 技术社区  · 6 年前

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

    这是计算时间的函数:

    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) );
    

    有人能帮我解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Serge    6 年前

    通常方法是将函数参数传递给 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;
    }
    

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