C ++ переходя из одной части программы в другую - PullRequest
0 голосов
/ 30 апреля 2011

Итак, вот моя проблема. У меня есть программа, которая имеет 11 функций. Я хочу вызвать одну функцию из другой, но хочу, чтобы эта функция выполнялась где-то посередине? Любые предложения, как это можно сделать? функция goto - очень плохая привычка, поэтому я не хочу ее использовать.

EDIT: Сначала я инициализирую переменные с помощью load (), а затем использую их в цикле while. Здесь я хочу, чтобы при вызове функции, содержащей цикл while, она запускалась изнутри, а не инициализировала переменные. Извините за мой плохой английский.

void play()
{
load();
    while (!key[KEY_ESC])
    {

        two();

        clear_keybuf();
        acquire_screen();

        clear_to_color(screen,makecol(0,0,0));


        line( screen, 3, 0, 3, 600, makecol( 255, 255, 255));
        line( screen, 797, 0, 797, 600, makecol( 255, 255, 255));
...

}
}

Ответы [ 2 ]

7 голосов
/ 30 апреля 2011

Невозможно выполнить где-то посередине вызываемой вами функции.Функции - это вещи, которые вы можете вызывать, поэтому запуск функций - это места, с которых может начинаться вызов.Измените это:

void function1() {
    do_something;
    // <-- I want to start here
    do_something_else;
}

На это:

void function2(); // declaration - or just put function2 first

void function1() {
    do_something;
    function2();
}

void function2() {
    do_something_else;
}

Затем вызовите функцию 2 (), если вы хотите выполнить только вторую часть функции 1.

Вместо этого вы можетенапишите такую ​​функцию:

void function1(bool do_the_first_bit) {
    if (do_the_first_bit) {
        do_something;
    }
    do_something_else;
 }

Редактировать:

В вашем примере, где вы хотите начать внутри цикла, измените это:

void function1() {
    load();
    while (blah) {
        do_stuff;
    }
}

на это:

void function2() {
    // this avoids the test first time, so as to "start in the loop"
    do {
        do_stuff;
    } while (blah);
}

void function1() {
    load();
    if (blah) {
        function2();
    }
}

Затем, когда вы хотите просто выполнить цикл, а не загрузку, вызовите function2().

Повторения «бла» в обеих функциях следует избегать, если это возможно -Мне не ясно, означает ли «начало в цикле» «даже если условие цикла ложное, в любом случае запустите цикл один раз», но я интерпретировал это так, потому что это сложнее.

Другая альтернатива здесь:

void play() {
    static bool loaded = false;
    if (!loaded) {
        load();
        loaded = true;
    }
    do_the_other_stuff;
}

Это будет загружать при первом вызове, а не при последующих вызовах.Конечно, это не потокобезопасно, что может быть проблемой: для поточно-ориентированной инициализации ищите pthread_once или эквивалент .

В стороне:

Некоторые языки(но не C ++) имеет концепцию, называемую «подпрограммой», которая, приблизительно говоря, является функцией, которая может возвращать откуда-то посередине и «запоминать», откуда она вернулась, так что при следующем вызове она возобновляется изто же самое место.Такое поведение может быть подстроено жюри в C или C ++: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html,, но, безусловно, не рекомендуется делать это в качестве альтернативы определению одной функции для каждой «вещи», которую вы хотите сделать.Совместные процедуры полезны для того, чтобы «подобрать то, на чем вы остановились», а не для «выполнения только отдельных частей функции».

1 голос
/ 30 апреля 2011

Ваш вопрос не очень ясен, особенно в части "быть исполнителем где-то посередине". Однако, если ваша ситуация такова:

void func1()
{
    func2();
}

void func2()
{
    // Do something;
}

Так что func2 объявлен ниже func1, вы можете сделать так:

void func2();

void func1()
{
    func2();
}

void func2()
{
    // Do something;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...