2011-04-30 75 views
0

所以这里是我的问题。我有一个有11个功能的程序。我想从另一个函数中调用一个函数,但我希望该函数能够从中间的某个地方执行?任何建议如何做到这一点? goto功能是一个非常不好的习惯,所以我不想使用它。从一个程序的一部分到另一个的C++

编辑: 我首先用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)); 
... 

} 
} 
+0

请给出进一步的细节/向我们显示代码。 “中间的某个地方是什么意思?” – 2011-04-30 11:53:37

+1

@Ignacio:公共/私人说明符与它有什么关系? – 2011-04-30 11:59:02

+0

什么都没有。我只是累了。 – 2011-04-30 12:01:55

回答

7

这是不可能从某处的函数中执行你呼叫。函数你可以调用的东西,因此函数的开始是调用可以开始执行的地方。更改此:

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()

如果可能的话,应该避免在两个函数中重复“blah” - 我不清楚“在循环中启动”是否意味着“即使循环条件为假,反正一次运行循环“,但我已经这样解释,因为这很难。这里

另一种方法是:

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

这将加载第一次它的名字,并在后续调用不会加载。当然,它不是线程安全的,这可能是一个问题:对于线程安全初始化,查找pthread_onceequivalent

旁白:

一些语言(而不是C++)有一个概念叫做“协程”,这近似地说是可以从中间的某个位置返回并“记住”它从返回的功能,以便下次调用它时从同一个地方恢复。这种行为可以用C或C++进行评审:http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html,但当然不建议将其作为为每个“事物”定义一个要执行的功能的替代方法。协同例程对于“拾取离开的位置”非常有用,而不是“仅执行该功能的选定部分”。

+0

是的,这正是我想要做的“拾取我离开的地方”..我现在将阅读artcile。谢谢! – Martin 2011-04-30 12:11:58

+0

+1能够对不明确的问题给出明确的答案。我不得不承认,我放弃了解析“中间某个地方”这个问题 – hirschhornsalz 2011-04-30 12:15:17

+0

@Martin:当我说“陪审员被绑架”时,那种合作惯例的东西确实是相当黑客。作者在PuTTY中说他自己的代码*,“据我所知,这是在严肃的生产代码中见过的最糟糕的C hackery”。他这样做是因为他非常有经验并且有信心使用C,所以使用它会是一个错误,因为你对* C没有足够的经验和信心,并且没有办法解决你的问题。 Hacky代码有无法预料的后果,你必须处理... – 2011-04-30 12:20:11

1

你的问题不是很清楚,特别是“要在中间某处执行”部分。但是,如果你的情况是这样的:

void func1() 
{ 
    func2(); 
} 

void func2() 
{ 
    // Do something; 
} 

这样FUNC2声明如下FUNC1你可以这样做:

void func2(); 

void func1() 
{ 
    func2(); 
} 

void func2() 
{ 
    // Do something; 
} 
相关问题