2011-04-30 76 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; 
} 
相關問題