在網路上看到的別人寫的文章,覺得解析得不錯,就貼過來了!
長跳轉(long jump)的原理是:設定一條語句的唯一標識(setjmp(jmp_buf jmpb)),再通過長跳轉(longjmp(jmp_buf jmpb, int retval))
轉到jmpb所標識的語句。
先看一下setjmp和longjmp這兩個函式的用法吧。
函式名: setjmp
函式原型:int _cdecl setjmp(jmp_buf jmpb);
作用: 設定非本地跳轉。即乙個返回點,當程式呼叫longjmp函式(不論longjmp()和setjmp()是否在同乙個函式或同乙個作用域。)時,
就可以返回到這個返回點,繼續從這個點往下執行。
形參: jmpb用來保護現場。
返回值: 首次呼叫返回0,當longjmp()返回時,呼叫返回值用longjmp()設定。
函式名: longjmp
函式原型:void _cdecl longjmp(jmp_buf jmpb, int retval);
作用: 返回到setjmp()所設定的返回點。
形參: jmpb:用於恢復現場(由呼叫setjmp()時設定的)
retval:返回到setjmp()所在的位置時,設定第二次setjmp()的返回值。
返回值: 無
再來看看它的使用例子吧。
#include
#include
#include
void longjmpfun(jmp_buf jumppointer);
int main(void)
else
return 0;
}void longjmpfun(jmp_buf jumppointer)
執行結果:
function "setjmp" return value: 0
be about to call longjmp...
be in longjmpfun
function "setjmp" return value: 10
LZW基於C語言的實現
lzw演算法具有很多版本,其大致思想一致。主要思想是盡最大可能不產生冗餘,以自適應的方式建立乙個內部字典。其演算法流程如下 lzw演算法流程 步驟1 開始時的詞典包含所有可能的根 root 而當前字首p是空的 步驟2 當前字元 c 字元流中的下乙個字元 步驟3 判斷綴 符串p c是否在詞典中 1 如...
基於HTTP的長輪詢簡單實現
web客戶端與伺服器之間基於ajax http 的常用通訊方式,分為短連線與長輪詢。短連線 客戶端和伺服器每進行一次http操作,就建立一次連線,任務結束就中斷連線。在長輪詢機制中,客戶端像傳統輪詢一樣從伺服器請求資料。然而,如果伺服器沒有可以立即返回給客戶端的資料,則不會立刻返回乙個空結果,而是保...
基於C語言的B 樹的實現
用下圖所示的方式描述軟體的功能結構。b 樹的查詢過程 根據給定值查詢結點和在結點的關鍵字中進行查詢交叉進行。首先從根結點開始重複如下過程 若比結點的第乙個關鍵字小,則查詢在該結點第乙個指標指向的結點進行 若等於結點中某個關鍵字,則查詢成功 若在兩個關鍵字之間,則查詢在它們之間的指標指向的結點進行 若...