Передача функции в качестве аргумента другой функции - PullRequest
0 голосов
/ 13 октября 2018

Я читал об этой теме.Я рассмотрел множество возможных решений, поэтому, пожалуйста, не отмечайте мой вопрос как дублированный, мне нужно только однозначное решение этой проблемы.

У меня есть функция, которая рассчитывает время выполнения некоторого кода.Этот код будет отправлен в качестве аргумента (будет функцией).

Это функция, которая вычисляет время:

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 Ответ

0 голосов
/ 13 октября 2018

обычно способ сделать это - передать аргументы функции в 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) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...