全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2374
推到 Plurk!
推到 Facebook!

void (*signal(int sig, void (*handler)(int)))(int)

答題得分者是:harpist
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-03 04:23:36 IP:203.70.xxx.xxx 訂閱
void (*signal(int sig, void (*handler)(int)))(int)

handler 可以看出是個函式指標

我看不懂的是 (*signal(int sig, void (*handler)(int))) 整個來看 又要怎麼解釋 signal ? 它是函式指標嗎?

看起來有像, 又感覺怪怪的 , 想知道這函式運作執行的過程是怎麼處理的?

謝謝


編輯記錄
yshihyu 重新編輯於 2007-07-03 04:26:57, 註解 無‧
yshihyu 重新編輯於 2007-07-03 04:28:51, 註解 無‧
taishyang 重新編輯於 2007-07-03 10:18:52, 註解 將文章分類成[問題]‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-03 22:03:25 IP:59.105.xxx.xxx 訂閱
真的有人會在自己的程式放這種東西嗎 

<textarea cols="60" rows="10" class="cpp" name="code"> typedef void (*signal(int sig, void (*handler)(int abc)))(int xyz); typedef void (*signal2)(int xyz); //--------------------------------------------------------------------------- void XXsignal(int sig, void (*handler)(int abc))(int xyz) { // [C Error] UnitXX.cpp(14): E2091 Functions cannot return arrays or functions return 1; // [C Error] UnitXX.cpp(15): E2034 Cannot convert 'int' to 'void(int)' } //--------------------------------------------------------------------------- void XXsignal2(int xyz) { ShowMessage(xyz); } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { signal2 a=XXsignal2; a(100); } //--------------------------------------------------------------------------- </textarea><br /> 錯誤訊息如上註解, 由錯誤訊息可知 signal 是函式指標,只是其傳回型態是 void(int)
在 BCB(我用的是5)中並無法傳回這的型態。
abc, xyz 是我多加的,用意只在於那些都是宣告時用的假參數並不是主要宣告的名稱,
原 void (*signal(int sig, void (*handler)(int)))(int) 與
void (*signal(int, void (*)(int)))(int) 相同。
這種東西,個人建議,看看就好,不必花太多時間在上面,不實用,用了只是增加自己日後維護的負擔。
------
http://www.ViewMove.com
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-03 22:18:14 IP:125.231.xxx.xxx 未訂閱
有啊。這個東西很有名耶。
只是我不知道在 windows 是不是有把它實做在裏面。
在 UNIX 中。如果你看那一個程式不爽。你可以下 kill -9 pid
可以把那個程式由系統中砍掉。
也就是像你在 windows 的工作管理員中把它強制移除一樣。
而這個 kill -9 pid 就是說把 9 這個數值送入 signal 這個函數
去處理。
所以你的程式不止是我們平時寫的那樣。還必須要寫收到這些值
要怎麼處理。在 unix 裏還有可以讓你的程式不用離開,可以要求它
”從新載入"config 檔。等等這種安排。

你可以按 control F1 找 signal 就可以看到這個東西了。
它是標準C的東西。只是我再重申一次。我不知道 windows 對它的實作
到什麼程度。我在 unix 上,是有在使用這樣的功能。
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-03 22:52:24 IP:59.105.xxx.xxx 訂閱
原來是很有名的東西呀... 對不起,我看得太少了 :P
看了線上說明,感覺好像是 DOS 的中斷服務常式。
------
http://www.ViewMove.com
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-03 22:54:23 IP:203.70.xxx.xxx 訂閱
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

相當於
void (*signal(int signum,void (*handler)(int)))(int);




typedef void (*sighandler_t)(int);
void signal( int signum, sighandler_t handler ); // 為何不這樣宣告? 感覺這樣比較正確 , 還是它有特殊用意?


因為宣告成
void * signal(int signum,void (*handler)(int))) (int) ; // 這邊的 signal 算是函式指標嗎? 感覺 ( int ) 完全用不到為何要這樣宣告?

謝謝






暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-03 23:00:03 IP:125.231.xxx.xxx 未訂閱
嗯。也可以那樣說沒錯。有點類似啦。

沒有啦。因為玩的系統比較多。所以看的不一樣。
它就好像 windows 的 message 的感覺。
你可以丟進某個程式。而那個程式收到了要處理。。。。。。ETC
講 windows 的 message 應該會比較有概念。
只是不同的作業系統有不同的實作方式。
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-04 00:24:17 IP:211.74.xxx.xxx 未訂閱
沒有那麼複雜, signal 函數是 ANSI C 所定義,這就是它的函式宣告
<textarea class="cpp" rows="10" cols="60" name="code">void (*signal(int sig, void (*handler)(int)))(int); </textarea>
signal 是一個函式名稱而回傳值 void (*)(int) 也就是一個函式的位址,至於這個函式是什麼?
其實跟signal 函式的第二個參數有些關係,這個部分你去了解一下signal 這個函式的用途就
會知道了。

不曉得這個函式在windows下有什麼作用?倒是沒試過。不過在 UNIX / Linux 下 singal 卻是
很重要的東西,一種軟體中斷非常好用。


===================引 用 yshihyu 文 章===================
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

相當於
void (*signal(int signum,void (*handler)(int)))(int);



?
typedef void (*sighandler_t)(int);
void signal( int signum, sighandler_t handler?); // 為何不這樣宣告? 感覺這樣比較正確 , 還是它有特殊用意?


因為宣告成
void * signal(int signum,void (*handler)(int))) (int) ; // 這邊的 signal 算是函式指標嗎? 感覺 ( int?) 完全用不到為何要這樣宣告?

謝謝






------
~§~迷時師渡,悟了自渡~§~
編輯記錄
harpist 重新編輯於 2007-07-04 01:01:35, 註解 無‧
系統時間:2024-04-28 13:34:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!