Передача функции с двумя параметрами в функцию, которая принимает функцию с одним параметром в качестве ввода в C - PullRequest
0 голосов
/ 02 апреля 2020

Я кодирую в C. Я хотел бы передать функцию, которая принимает два параметра с одним параметром, установленным в значение, в функцию, которая принимает функцию с одним параметром в качестве ввода.

void fTwoParameters( float a, float b ){
}

void outerFunction( void (*fOneParameter)(float) ){
}

void main( void ){
  // How can I do that?
  for( int i=1, i<1000, i++ ){
    // I would like to pass fTwoParameters into outerFunction with b set to the value of i
    outerFunction( /* Problem is Here */ )
  }
}

Я думаю, что это можно сделать с помощью глобальных переменных. , Есть ли способ сделать это без глобальной переменной?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

К сожалению, стандартный C здесь вам мало поможет. Вы можете установить глобальную переменную, хотя это обычно затрудняет понимание программы в дальнейшем.

Стандартный способ решения этой проблемы - убедиться, что любая функция outer, которая Вы определяете и который принимает указатель на другую функцию inner, принимает аргумент, который только что передан inner. (Очень часто этот аргумент будет void*, особенно в случае библиотек, чтобы он мог передавать что угодно.)

int inner(int x, void* user_data) {
  int y = *((int*)user_data);
  return x * y;
}

int outer(int (*inner)(int, void*), void* user_data) {
  return inner(42, user_data);
}

int main(void) {
  int y = 17;
  return outer(&inner, &y);
}

Если вы используете G CC, вы можете использовать вложенные функции, но учтите, что это расширение GNU и может не работать с другими компиляторами.

float twoParameters(float a, float b) {
  return a * b;
}

void main(void) {
  const float a = 42.0;

  float oneParameter(float b) {
    return twoParameters(a, b);
  }

  outerFunction(&oneParameter);
}
1 голос
/ 02 апреля 2020

externalFunction - это функция оптимизации, называемая бинарным поиском. Оптимизирует целевую функцию одного параметра. У меня есть целевая функция двух параметров. Я хочу перебрать второй параметр и для каждого значения выполнить бинарный поиск, чтобы определить оптимальный первый параметр. То есть я хочу провести исчерпывающий поиск по второму параметру. Мысли?

Объяснение этого с самого начала позволило бы избежать путаницы.

Вы не можете (даже с глобальной переменной). Если вы не можете изменить код outerFunction или fTwoParameters, вам придется самостоятельно создать новую функцию.


СТАРЫЙ ОТВЕТ

Вы не может. C не позволяет передавать другой тип, определенный в сигнатуре функции. Чего бы вы ни хотели достичь, вам нужно будет сделать это по-другому.

Например, вы можете создать обобщенную функцию c с дополнительным аргументом для указания количества аргументов (передайте функцию приведите к void (*)(void) в этом случае):

void outerFunction(unsigned nargs, void (*funcptr)(void)) {
    if (nargs == 1) {
        void (*realfunc)(float) = (void (*)(float))funcptr;
        realfunc(1.0);
    } else if (nargs == 2) {
        void (*realfunc)(float, float) = (void (*)(float, float))funcptr;
        realfunc(1.0, 2.0);
    } /* ... */
}

Хотя вам не нужно передавать функцию. Вы можете просто вызвать его из другой функции (или main) с любым вторым параметром, который вам нужен.


Обращаясь к вашему редактированию, вы можете просто сделать следующее:

void outerFunction(void (*funcptr)(float, float), float b) {
    funcptr(1, b);
}

for (int i = 1; i < 1000; i++){
    outerFunction(fTwoParameters, i);
}

Или даже:

for (int i = 1; i < 1000; i++){
    fTwoParameters(1, i);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...