Использование переменной для представления функции в C - PullRequest
0 голосов
/ 07 октября 2009

Это функциональность, которую я хочу (и она работает)

#include <stdio.h>
//includes other libraries needed

int foo();

int main() 
{
    while(true) 
    {

        while(foo()==1) 
        {
            //do something
        }

        //does other unrelated things

    }

}

int foo() 
{
    // Returns if a switch is on or off when the function was called 
    // on return 1;
    // off return 0;
}

Однако я бы хотел, чтобы это произошло:

#include <stdio.h>
//includes other libraries needed

int foo();

int main() 
{
    while(true) 
    {
        //THIS IS THE PROBLEM
        int something = foo();

        while(something==1) 
        {
            //do something
        }

        //does other unrelated things

    }

}

int foo() 
{
    // Returns if a switch is on or off when the function was called 
    // on return 1;
    // off return 0;
}

Как я могу обновлять переменную что-то каждый раз, когда вызывается внутренний цикл while? Я знаю, что это как-то связано с & или * для ссылок и указателей, но я не смог найти пример онлайн по этому поводу.

Также я не могу ничего редактировать в функции foo().

Ответы [ 4 ]

8 голосов
/ 07 октября 2009

Я думаю, это то, что вы имеете в виду: он использует указатель функции для представления функции foo. Позже он назначает его функции bar:

#include <stdio.h>
//includes other libraries needed

int foo();
int bar();

int main() 
{
    while(true) 
    {
        int (*something)() = &foo;

        while(something()==1) 
        {
                something = &bar;
        }

        //does other unrelated things

    }

}
6 голосов
/ 07 октября 2009

Поскольку функция foo () возвращает значение, вам нужно снова вызвать функцию, чтобы получить последнюю версию значение. Краткий способ сделать это в C состоит в том, чтобы выполнить назначение и проверить вместе:

while ((something = foo()) == 1)
{
     // do something
}
1 голос
/ 07 октября 2009

Для представления функции в переменной используйте указатель на функцию

 int (*something)() = &foo;
0 голосов
/ 07 октября 2009

Как насчет этого для вашего цикла:

while(true) 
{
    int something = foo();
    // do whatever here

    if (!something) continue;
    do 
    {
      //do something
    } while(foo()==1)

    //does other unrelated things
}

Предполагается, что из вашего примера вы хотите, чтобы переменная что-то делала перед циклом, и не хотите нового вызова функции foo () перед входом в цикл.

Если нет, то, как упоминалось в другом посте, вы можете просто сделать while(something = foo()) == 1)

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