2017-03-18 30 views
0

我正在寫一個C代碼,這個代碼由許多子函數組成,並且在一個子函數中還有另一個子函數,在執行這個子子函數之後,我需要回到主函數的開頭。如何從C編程語言的子函數開始使用主函數?

我的問題是我該如何退出此功能並返回主要功能?

由於這段代碼太大所以我沒有在這裏包含這段代碼。我認爲return;不能做這件事,因爲它只返回函數調用的函數。我是C編程的初學者,所以請提出我需要做的事情?

enter image description here

+2

也許構建一個小例子來演示你正在嘗試做什麼 –

+2

如果是這樣的話,你應該用一個循環來啓動你的主函數,但是我們不能肯定地說不知道更多並且看到相關代碼 –

+1

在結構化編程原理髮展60年後,你真的不想這麼做。如果您正在從事軟件開發工作,那麼這可能會嚴重損害您的職業生涯!學會正確設計和編寫代碼。 – Clifford

回答

2

這個答案需要一個健康危害 - 這是錯誤的方式來編程

您可以使用setjmplongjmp做到這一點。通過思考代碼的設計事先

+0

@Prayuktibid:雖然這是完全按照ed所強調的要求的方式,但你真的不希望這樣做。我希望埃德甚至擔心你已經接受了這個答案。 – Clifford

+0

@Clifford - 這是一個解決方案。但海報確實需要重新思考。我希望海報不接受答案,並會回到圖畫書 –

+0

**任何機構閱讀此答案 - 做這些時,沒有其他選項可用** –

2

Ç維持嵌套函數疊層。如果主程序調用函數1並調用函數2,則只能通過在每個函數中使用return語句(因此從2返回到1,然後返回主)展開堆棧,才能返回主程序。所以我認爲你不能做你想做的事。您可以使用exit語句完全終止程序。

0

使內部函數返回一個值,而不是void -

在你的力量來避免這種做的一切。在中間函數中使用該值來確定是否應該返回到main

int main(void) { 
    f2(); 
    return 0; 
} 

void f2(void) { 
    if (f1()) return; 
    /* ... */ 
} 

int f1(void) { 
    if (condition true) return 1; 
    /* ... */ 
    return 0; 
} 
1
跨越

函數邊界跳躍是違背結構化編程,並且雖然可能(使用的setjmp(),longjmp的())是不合適的,不必要在這種情況下。

您不需要將函數調用視爲簡單的子例程 - 它們需要參數和返回值;在這種情況下,返回值特別有用於向調用者提供用於控制程序流的信息。

根據你的(有點混亂)圖中:

typedef enum tStatus 
{ 
    STATUS_FAIL ; 
    STATUS_SUCCESS ; 
} tStatus; 

void function1(void) ; 
tStatus function2(void) ; 
tStatus function1n(void) ; 

int main() 
{ 
    for(;;) 
    { 
     // statement1 
     // statement2 

     function1() ; 
     if(function2() == STATUS_SUCCESS) 
     { 
      // statement3 
     } 
    } 

    return 0 ; 
} 

void function1(void) 
{ 
    // do something 
} 

tStatus function2(void) 
{ 
    // statement1 
    // statement2 

    tStatus status = function1n() ; 
    if(status == STATUS_SUCCESS) 
    { 
     // statement n 
    } 

    return status ;   
} 

tStatus function1n(void) 
{ 
    tStatus status = STATUS_FAIL ; 

    // statement1 

    if(!condition) 
    { 
     status = STATUS_SUCCESS ; 
     // statement n 
    } 

    return status ; 
} 

如果按照碼流,你會看到,當function1n()conditiontrue然後STATUS_FAIL回到function2(),它返回STATUS_FAILmain()這然後使控制流回到main()循環的頂部。

請注意,大多數簡單的裸機嵌入式系統不會從main()返回,因此在不使用OS或RTOS時無限循環是正常實現。