Значение lvalue требуется в качестве унарного операнда «&» при передаче функции в функцию - PullRequest
2 голосов
/ 23 апреля 2019

Я только знакомлюсь с тем, как передать функцию в качестве параметра другой функции, а также с указателями / C в целом.

У меня есть следующая функция, которая принимает другую функцию:

void func(void (*vect) (float *, float), float *x1, float size)
{
    vect(&x1, size);
    // other instructions
}

Вот как определяется foo (foo - это vect, который я передаю функции):

void foo(float *x1, float size)
{
    //
}

И вот как я использую функцию func

func(&foo(&x1, size), &x1, size);

По какой-то причине я получаю следующую ошибку:

error: lvalue required as unary '&' operand

Кто-нибудь поделится своим пониманием того, почему это происходит?

1 Ответ

6 голосов
/ 23 апреля 2019

Когда вы делаете это:

&foo(&x1, size)

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

При использовании указателя на функцию используйте просто имяфункция, а не оператор вызова функции ():

func(foo, &x1, size);

Кроме того, это неверно:

vect(&x1, size);

Поскольку &x1 имеет тип float **, но vect ожидаетего первый аргумент имеет тип float *.Вы вместо этого хотите:

vect(x1, size);
...