я хочу только знать
void map (int (*fun) (int),int x[ ], int l) {
for(i = 0; i < l; i++)
x[i] = fun(x[i]);
}
почему вы используете это вместо:
void map (int x[ ], int l) {
for(i = 0; i < l; i++)
x[i] = nameoffunction(yourargument);
}
Давайте ответим на вопрос вопросом - что, если вы хотите выполнить более одного типа картирования? Что, если вы хотите отобразить и x 2 и & radic; x ?
Конечно, вы могли бы сделать что-то вроде
void map( int x[], int l, int type )
{
for ( int i = 0; i < l; i++ )
{
if ( type == MAP_SQUARED )
x[i] = int_square( x );
else if ( type == MAP_ROOT )
x[i] = int_root( x );
...
}
}
, который работает, но трудно читать и громоздок в обслуживании - каждый раз, когда вы хотите выполнить новое отображение, вы должны добавить новый случай в функцию map
.
Сравните это с
void map( int x[], int l, int (*fun)(int) )
{
for ( int i = 0; i < l; i++ )
x[i] = fun( x[i] );
}
...
map( x, l, int_square );
map( y, l, int_root );
Вам не нужно взламывать функцию map
, чтобы получить различные сопоставления - вам нужно только передать функцию, которая работает с отдельными элементами. Если вы хотите выполнить новое отображение, все, что вам нужно сделать, это написать новую функцию - вам совсем не нужно редактировать функцию map
.
Стандартная библиотека C использует эту форму делегирования в нескольких местах, включая функцию qsort
(позволяющую сортировать массивы любого типа в любом порядке) и функцию signal
(позволяющую изменять реакцию программы прерывать динамически).