2015-03-04 2 views
-2

Я знаю, что это может звучать sci-fi, но я действительно хочу вызвать функцию x раз, используя массив указателей на нее и без привлечения цикла или всего, что может замедлить целевую программу. Это возможно, и если да, то как именно?Буфер функций указателей?

+6

Это, безусловно, возможно, но зачем вам нужен массив указателей функций для вызова функции x раз? Просто назовите это x раз. – Wintermute

+0

Не считая того, что сказал @Wintermute, вы должны объявить массив нужного размера, а затем скопировать тот же указатель на каждый элемент массива. Это отнимает RAM и почти наверняка медленнее, чем просто вызов указателя в цикле. –

+0

Создайте временную переменную, указывающую на начало массива и тип указателя внутри массива. Затем используйте переменную temp для перемещения по массиву с подсчетом количества указателей. – pmac89

ответ

0

Вот пример глубины ограниченной рекурсии

void hello(int depth) 
{ 
    printf("hello %2d\n", depth); 
    if (depth > 1) 
     hello(depth - 1); 
} 

int main() 
{ 
    hello(10); // call the hello function 10 times 
    hello(17); // call the hello function 17 times 
} 

А вот пример вызова указатель функции несколько раз, используя таблицу переходов. Обратите внимание, что в таблице переходов максимальное количество вызовов ограничено размером таблицы перехода (10 в этом примере), тогда как при рекурсии количество вызовов ограничено только размером стека.

int hello(int n) 
{ 
    n++; 
    printf("hello %2d\n", n); 
    return n; 
} 

void executeFunction(int (*func)(int), int count) 
{ 
    int n = 0; 
    switch (count) 
    { 
     case 10: n = (*func)(n); 
     case 9: n = (*func)(n); 
     case 8: n = (*func)(n); 
     case 7: n = (*func)(n); 
     case 6: n = (*func)(n); 
     case 5: n = (*func)(n); 
     case 4: n = (*func)(n); 
     case 3: n = (*func)(n); 
     case 2: n = (*func)(n); 
     case 1: n = (*func)(n); 
    } 
} 

int main() 
{ 
    executeFunction(hello, 3); // call the hello function 3 times 
    executeFunction(hello, 9); // call the hello function 9 times 
} 
+0

.... это заставит программу зайти в течение длительного периода времени, особенно если количество вызовов функций велико. Вот почему я прямо сказал .. БЕЗ ЛУП. Несколько раз. 'for (;;)' является наиболее очевидным циклом. – DeltaProxy

+0

@DeltaProxy вы, очевидно, не понимаете, для чего используется цикл for. это «бесконечный» цикл, используемый ** исключительно ** для получения пользовательского ввода. Суть этого ответа - рекурсия. Цикл можно полностью исключить. –

+0

@DeltaProxy Там, все фиксированные, нет петель. – user3386109

0

Вы можете использовать предварительный процессор для расширения макроса до количества вызовов функций. Ваш код станет больше, и вы все равно будете выполнять функцию x раз. Это ничего не выиграет.

#define REPEAT5(x) { x; x; x; x; x; } 

Обратите внимание, что вы не можете вызвать этот макрос как функция (она будет расширяться к синтаксической ошибке, если вы завершения вызова с точкой с запятой). Очиститель макросъемки (?, Хотя в этом контексте, что это имеет значение) будет:

#define REPEAT5(x) do { x; x; x; x; x; } while(0) 

Тогда вы могли бы назвать макрос как функция, но расширяется к петле, и вы сказали, что вы не любите петли ,