Я знаю, что это может звучать sci-fi, но я действительно хочу вызвать функцию x раз, используя массив указателей на нее и без привлечения цикла или всего, что может замедлить целевую программу. Это возможно, и если да, то как именно?Буфер функций указателей?
ответ
Вот пример глубины ограниченной рекурсии
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
}
.... это заставит программу зайти в течение длительного периода времени, особенно если количество вызовов функций велико. Вот почему я прямо сказал .. БЕЗ ЛУП. Несколько раз. 'for (;;)' является наиболее очевидным циклом. – DeltaProxy
@DeltaProxy вы, очевидно, не понимаете, для чего используется цикл for. это «бесконечный» цикл, используемый ** исключительно ** для получения пользовательского ввода. Суть этого ответа - рекурсия. Цикл можно полностью исключить. –
@DeltaProxy Там, все фиксированные, нет петель. – user3386109
Вы можете использовать предварительный процессор для расширения макроса до количества вызовов функций. Ваш код станет больше, и вы все равно будете выполнять функцию x раз. Это ничего не выиграет.
#define REPEAT5(x) { x; x; x; x; x; }
Обратите внимание, что вы не можете вызвать этот макрос как функция (она будет расширяться к синтаксической ошибке, если вы завершения вызова с точкой с запятой). Очиститель макросъемки (?, Хотя в этом контексте, что это имеет значение) будет:
#define REPEAT5(x) do { x; x; x; x; x; } while(0)
Тогда вы могли бы назвать макрос как функция, но расширяется к петле, и вы сказали, что вы не любите петли ,
Это, безусловно, возможно, но зачем вам нужен массив указателей функций для вызова функции x раз? Просто назовите это x раз. – Wintermute
Не считая того, что сказал @Wintermute, вы должны объявить массив нужного размера, а затем скопировать тот же указатель на каждый элемент массива. Это отнимает RAM и почти наверняка медленнее, чем просто вызов указателя в цикле. –
Создайте временную переменную, указывающую на начало массива и тип указателя внутри массива. Затем используйте переменную temp для перемещения по массиву с подсчетом количества указателей. – pmac89