2012-07-28 89 views
0

以下是我的場景的一個簡化例子(這看起來很常見);C++參考函數裏面的函數

#include <signal.h> 

void doMath(int &x, int &y); 
void signal_handler(int signal); 

int main() { 
    signal (SIGINT,signal_handler); 
    int x = 10; 
    int y; 
    doMath(x,y); 
    while(1); 
    return 0; 
} 

void doMath(int &x, int &y) { 
    for(int y=0; y<=x; y++) { 
    cout << y << endl; 
    } 
    return; 
} 

void signalHandler(int signal){ 
    doMath(x,y); 
    exit(1); 
} 

這個基本的程序在屏幕上打印1到10,然後掛在那裏,直到按下CTRL + C。在這一點上,我想要doMath()函數再次運行。我可以看到發生這種情況的唯一方法是,如果我將x和y傳遞給signalhandler(),那麼它可以將它們傳遞到doMath(),並且還可以引用doMath()函數。

它我的實際程序有兩個doMath()函數和更多的變量,我想最後轉儲的變量值。因此,將所有這些變量傳遞給signalHandler然後傳遞給兩個函數似乎是一種低效的方式。有沒有其他的方法呢?

+0

如何設置程序,使ctrl-c不中斷它,並像普通字符一樣閱讀它? – 2012-07-28 14:24:12

+0

使用ctrl-c有什麼意義?爲什麼不讓他們按回車? – 2012-07-28 14:29:30

+0

那麼在稍後的日子,程序會做的更多,所以它必須在CTRL + C上(就像在程序被殺的時候一樣),我想在終止點處進行最後的值轉儲 – jwbensley 2012-07-28 14:29:32

回答

2

我認爲你需要使用一個全局變量。

雖然一般應避免使用全局變量,但有時候沒有其他選擇。嘗試儘可能少地使用和記錄他們的使用清楚:

#include <signal.h> 

void signalHandler(int signal); 
void doMath(int &x, int &y); 

struct DoMathArgs { 
    int x; 
    int y; 

    void callDoMath() { doMath(x,y); } 
}; 



// We have to use this global variable to pass the arguments to doMath when 
// the signal is caught, since the signal handler isn't passed any arguments 
// that we can use for our own data. 
DoMathArgs global_do_math_args; 

int main() { 
    signal (SIGINT,signalHandler); 
    global_do_math_args.x = 10; 
    global_do_math_args.callDoMath(); 
    doSomethingForever(); 
    return 0; 
} 


void signalHandler(int signal) { 
    global_do_math_args.callDoMath(); 
    exit(1); 
} 

void doMath(int &x, int &y) { 
    for(int y=0; y<=x; y++) { 
    cout << y << endl; 
    } 
    return; 
} 
+0

這段代碼可以工作,但實際上比C++更具有C語言。爲什麼不製作一個擁有參數的類,並且具有DoMath函數 - 一個需要兩個參數,另一個不需要。第二個使用它所持有的參數來調用第一個參數。 – 2012-08-19 13:53:35

+0

@KateGregory:我走了一半。我認爲創建成員函數是一個好方法,因爲它使得全局變量和它的使用之間的關係更加明顯。但是,我將doMath函數作爲獨立函數離開,以便與原始代碼的關係更清晰。 – 2012-08-19 14:14:18

0

一個更有效的方法是定義一個事件,在main中等待,在signal中設置它,然後在main中再次調用doMath。