|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
C程序的任意跳轉(zhuǎn) |
| 作者:wenfengcom 欄目:單片機 |
void main(void) { 。CHAR i,count; . . . ll: i=count; . . . max(i);//調(diào)用 . . . } void max(UCHAR i) { ; } 當程序正在MAX中執(zhí)行時,某一條件滿足了,要從MAX跳轉(zhuǎn)到MAIN開頭的ll這一語句從新開始執(zhí)行,請問如何實現(xiàn), |
| 2樓: | >>參與討論 |
| 作者: computer00 于 2006/1/13 19:26:00 發(fā)布:
你的要求真是奇怪。 void main(void) { 。CHAR i,count; . . . ll: i=count; . . . max(i);//調(diào)用 if(flag)goto ll; . . . } void max(UCHAR i) { if(something_is_true) { flag=1; return; } flag=0; } |
|
| 3樓: | >>參與討論 |
| 作者: wenfengcom 于 2006/1/13 19:46:00 發(fā)布:
直接 我的程序中不能這樣跳,要求直接在MAX中跳到LL,用指針函數(shù)可以跳,但是多次將會堆棧溢出, void (*p)(); void max() { if(SomeThing==True) { p=ll; p(); } . ; } 多次將導致堆棧溢出,因為MAX有壓棧沒有出棧 |
|
| 4樓: | >>參與討論 |
| 作者: computer00 于 2006/1/13 20:03:00 發(fā)布:
那你干脆用匯編寫算了。這不是用C語言寫程序的思路。 |
|
| 5樓: | >>參與討論 |
| 作者: Bingoes 于 2006/1/13 22:42:00 發(fā)布:
那為何非得將max定義成函數(shù)呢? 何不 max: if(something==true) goto ll; 。。。。。 你即使用匯編,在子程序中直接返回到主程序, 也會存在堆棧的問題啊,不過在匯編中可以手 動釋放,如連續(xù)執(zhí)行兩條POP ACC指令;但在 C中有沒執(zhí)行POP的指令,我就不清楚了 |
|
| 6樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/1/14 11:17:00 發(fā)布:
你為什么不寫成這樣呢? void main(void) { 。CHAR i,count; . . . max(i);//調(diào)用 . . . } void max(UCHAR i) { ll: i=count; . . . if(something_is_true) goto ll; } 這樣不行嗎?? |
|
| 7樓: | >>參與討論 |
| 作者: wenfengcom 于 2006/1/14 11:56:00 發(fā)布:
不行 MAX前面還有要執(zhí)行了,問題是MAX退出的時候怎樣處理堆棧? |
|
| 8樓: | >>參與討論 |
| 作者: dyidtm 于 2006/1/14 12:32:00 發(fā)布:
他是想遞歸調(diào)用吧,這樣資源會給你用光甚至無法用。 |
|
| 9樓: | >>參與討論 |
| 作者: computer00 于 2006/1/14 13:24:00 發(fā)布:
那你就強行修改堆棧內(nèi)容,然后return。 |
|
| 10樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/1/14 14:26:00 發(fā)布:
暈~~ 這么麻煩,就不如用匯編寫了,強行更改堆棧難免不出問題 |
|
| 11樓: | >>參與討論 |
| 作者: xwj 于 2006/1/14 18:12:00 發(fā)布:
這樣,不過規(guī)范的結(jié)構(gòu)化編程最好不要用goto bit max(uchar i) { ... if (條件滿足) return (1); ... ; return(0); } void main(void) { uchar i,count; . . . ll: i=count; . . . if (max(i)) goto ll;//調(diào)用 . . . } //本程序由xwj設計的UltraEdit腳本加亮顯示,如需要腳本請聯(lián)系xuwenjun@21cn.com |
|
| 12樓: | >>參與討論 |
| 作者: wenfengcom 于 2006/1/14 20:25:00 發(fā)布:
不是這樣 我希望是能直接在MAX中跳,不要調(diào)用后在GOTO ,MAX可能在被其它的函數(shù)調(diào)用,調(diào)用后能直接跳到LL,,我用指針函數(shù)實現(xiàn),但有堆棧溢出問題 |
|
| 13樓: | >>參與討論 |
| 作者: computer00 于 2006/1/14 20:49:00 發(fā)布:
真是暈。那就直接修改堆棧指針,然后使用return返回。 這樣一返回就返回到你要的那個地方了。 |
|
| 14樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/14 20:56:00 發(fā)布:
不建議這樣goto goto確實不可避免,但是一般只用在在函數(shù)內(nèi)部。 我看你的程序,只要采用一般設計主程序的大循環(huán)的思路就可以解決。 如果勉強實現(xiàn)你的思路,可讀性會很差。 |
|
| 15樓: | >>參與討論 |
| 作者: ketp 于 2006/1/14 22:10:00 發(fā)布:
- 想任意跳轉(zhuǎn)就只有用 setjmp,longjmp了。 |
|
| 16樓: | >>參與討論 |
| 作者: xwj 于 2006/1/14 23:00:00 發(fā)布:
唉,lv子不可教也,懶得說了。computer00說得很明白了 還要大家怎么說。 樓主自己去玩“高級”技巧吧,我們就瞎別摻合了 |
|
| 17樓: | >>參與討論 |
| 作者: coldra 于 2006/1/14 23:59:00 發(fā)布:
想不出什么地方需要這樣的跳轉(zhuǎn) 其實在C語言中goto語句完全可以不用,一個良好的程序設計結(jié)構(gòu),不需要這樣的跳轉(zhuǎn)的,任何函數(shù)都要完整的執(zhí)行完,可以利用返回變量確定下一步要怎么辦,從一個函數(shù)中強行跳出看似直接,可是會帶來很多問題,處理起來反而會麻煩,可讀性差,給后續(xù)維護帶來很多障礙。 所以樓主還是放棄這種思路,如果函數(shù)中間需要跳轉(zhuǎn)出去,那么就請?zhí)皆摵瘮?shù)出口處自然退出,并返回一個返回值,出去后再判斷如何跳轉(zhuǎn)吧。 |
|
| 18樓: | >>參與討論 |
| 作者: 李冬發(fā) 于 2006/1/15 12:09:00 發(fā)布:
你的設計思想有嚴重問題,請放棄這個想法! |
|
| 19樓: | >>參與討論 |
| 作者: sun0_liang 于 2006/1/17 9:44:00 發(fā)布:
我提一個方法: 先在主程序main中保存sp的值spx;在子程序max中需要跳至ll的地方 { 恢復spx; goto ll; } * - 本貼最后修改時間:2006-1-17 15:54:11 修改者:sun0_liang |
|
| 20樓: | >>參與討論 |
| 作者: cuiwei0513 于 2006/1/17 17:01:00 發(fā)布:
這樣做 想辦法把max return |
|
| 21樓: | >>參與討論 |
| 作者: wenfengcom 于 2006/1/17 17:47:00 發(fā)布:
我也這樣想的 可是return和(*P)()不能同時執(zhí)行,要是都能執(zhí)行就好了,指針函數(shù)用于任意跳轉(zhuǎn),return用于出棧 |
|
| 22樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/1/18 9:33:00 發(fā)布:
想不出還有什么更奇怪的思路了 樓主,你要解決了告訴大家一聲,謝了 |
|
| 23樓: | >>參與討論 |
| 作者: computer00 于 2006/1/18 10:00:00 發(fā)布:
如果是keil 51,直接修改堆棧內(nèi)容,恐怕是最快的了。 void max(void) { ......... ......... *((unsigned CHAR idata *)SP-1)=addr; *((unsigned CHAR idata *)SP)=addr>>8; return; //返回到addr處 ......... ......... } 真是想不通,樓主用C語言,居然還想著在函數(shù)之間跳來跳去,哎……無語了。 |
|
| 24樓: | >>參與討論 |
| 作者: Mr_Right 于 2006/1/19 12:09:00 發(fā)布:
可以用stjmp() |
|
| 25樓: | >>參與討論 |
| 作者: Mr_Right 于 2006/1/19 12:19:00 發(fā)布:
setjmp()與longjmp() goto只能實現(xiàn)本地跳轉(zhuǎn),而setjmp()與longjmp()的組合運用,能有效的實現(xiàn)程序控制流的非本地(遠程)跳轉(zhuǎn); |
|
| 26樓: | >>參與討論 |
| 作者: guoshoujin 于 2006/1/19 17:50:00 發(fā)布:
答復 void main(void) { CHAR i,count; Bool flag; . . . do{ ll: i=count; . . . flag = max(i);//調(diào)用 }while(flag) . . . } Bool max(UCHAR i) { ;if(滿足條件) return TRUE; else return FALSE; } |
|
| 27樓: | >>參與討論 |
| 作者: 陳遠征 于 2006/1/20 10:11:00 發(fā)布:
同意樓上guoshoujin的看法哈 |
|
| 28樓: | >>參與討論 |
| 作者: 不起眼 于 2006/1/20 10:43:00 發(fā)布:
ketp說的對 想任意跳轉(zhuǎn)就只有用 setjmp,longjmp了,這兩個函數(shù)是專門解決這類問題的,可以完成函數(shù)間跳轉(zhuǎn),而不產(chǎn)生堆棧溢出。 其原理是先在返回點使用setjmp,保存SP/PC到一個buf. 再在跳轉(zhuǎn)點使用longjmp 順便說一句,使用他們可以簡化程序結(jié)構(gòu)。 |
|
| 29樓: | >>參與討論 |
| 作者: cxd731 于 2006/1/20 17:54:00 發(fā)布:
倒死…… |
|
| 30樓: | >>參與討論 |
| 作者: zqz198312 于 2006/1/20 22:20:00 發(fā)布:
用匯編就不會這么麻煩哦 我認為用匯編會簡單的多哦 |
|
| 31樓: | >>參與討論 |
| 作者: 滌綸 于 2006/1/22 20:02:00 發(fā)布:
回復 不如樓主你就直接把你想做的東東說出來,讓大家?guī)湍銓憘程序得了。 |
|
| 32樓: | >>參與討論 |
| 作者: fushaobing 于 2006/1/23 14:26:00 發(fā)布:
勸樓主不要誤入歧途 你要考慮的不應該是“C程序的任意跳轉(zhuǎn)”,而是如何避免在C程序中任意跳轉(zhuǎn)。軟件發(fā)展到現(xiàn)在已經(jīng)是一門比較成熟的科學,有它自身的一些規(guī)律,你不要任意去踐踏這些規(guī)律。 |
|
| 33樓: | >>參與討論 |
| 作者: dujb 于 2006/1/25 9:08:00 發(fā)布:
C語言中有標準的函數(shù) 利用函數(shù) setjmp() 和getjmp() 來實現(xiàn),具體的方法可以看C參考 |
|
| 34樓: | >>參與討論 |
| 作者: gouki_s 于 2006/1/25 11:43:00 發(fā)布:
setjmp() 不過別在中斷里跳出來。 |
|
| 35樓: | >>參與討論 |
| 作者: fsclub 于 2006/1/25 19:05:00 發(fā)布:
樓主的C編程思想根本就是錯誤的, 想用匯編的思想來寫C程序. |
|
| 36樓: | >>參與討論 |
| 作者: 天樂 于 2006/1/26 0:07:00 發(fā)布:
不要清看門狗,直接返回 |
|
| 37樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/26 6:30:00 發(fā)布:
同意fushaobing 如果寫一段防止別人跟蹤的程序,可以采取樓主的思路,讓人不易看懂。 |
|
| 38樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2006/1/27 9:39:00 發(fā)布:
要想任意跳轉(zhuǎn),用OS算了,想跳到那里都可以哈 |
|
| 39樓: | >>參與討論 |
| 作者: aoshi 于 2006/1/29 23:40:00 發(fā)布:
re 修改堆棧是比較好的方法了,goto估計不適合, |
|
| 40樓: | >>參與討論 |
| 作者: 陳林海 于 2006/2/3 7:10:00 發(fā)布:
C程序的任意跳轉(zhuǎn) 用T0中斷就可以了 |
|
| 41樓: | >>參與討論 |
| 作者: 將軍令 于 2006/2/6 12:33:00 發(fā)布:
用setjmp和longjmp,可以任意跳躍 |
|
| 42樓: | >>參與討論 |
| 作者: tzfzephyr 于 2006/2/7 20:11:00 發(fā)布:
這位大哥。 你想實現(xiàn)什么功能,把問題說出來,讓大家看看有沒有那么折騰的必要。 |
|
| 43樓: | >>參與討論 |
| 作者: rivita 于 2006/2/8 15:21:00 發(fā)布:
算法存在問題 您應該從自身找找,您的算法就存在著致命的危險,不是不行但不提倡,可以用C嵌匯編來寫,就象寫潛入式系統(tǒng)那樣做,有空看看軟件工程您就明白了。 |
|
| 44樓: | >>參與討論 |
| 作者: jacy1233 于 2006/2/10 13:10:00 發(fā)布:
C程序的任意跳轉(zhuǎn) 用語句調(diào)用啊 |
|
| 45樓: | >>參與討論 |
| 作者: 電子塵埃 于 2006/2/14 19:11:00 發(fā)布:
這首歌,好好聽噢,叫什么歌名呀 |
|
| 46樓: | >>參與討論 |
| 作者: thinkey 于 2006/2/15 10:43:00 發(fā)布:
管別人用goto干嗎? bit max(uchar i) { ... if (條件滿足) return (1); ... ; return(0); } void ifmax() { if (max(i)) goto ll;//調(diào)用 } void main(void) { uchar i,count; . . . ll: i=count; . . . ifmax(); . . . } |
|
| 47樓: | >>參與討論 |
| 作者: tqdyx 于 2006/2/15 21:32:00 發(fā)布:
這好象是一個通訊協(xié)議的判斷 遇到過相似的問題,可用嵌套的do{}while(),前面有人已說了 |
|
| 48樓: | >>參與討論 |
| 作者: 豬一樣理想 于 2006/2/21 18:58:00 發(fā)布:
如果調(diào)用函數(shù)也可以這樣 ((void(*)(void))ll)(); |
|
| 49樓: | >>參與討論 |
| 作者: thinkey 于 2006/2/22 17:16:00 發(fā)布:
一定要這樣的話,我覺得是 (*(void * ())0) () |
|
| 50樓: | >>參與討論 |
| 作者: leezgnj 于 2006/2/23 9:37:00 發(fā)布:
去翻翻書 Keil |
|
| 51樓: | >>參與討論 |
| 作者: leezgnj 于 2006/2/23 9:43:00 發(fā)布:
去看看Keil的庫函數(shù) 如果我沒記錯的話 Keil 的庫函數(shù)有這樣兩個函數(shù): setenv() longjump() 好像還涉及到一個 env的數(shù)據(jù)結(jié)構(gòu) setenv() “l(fā)l”前面 根據(jù)參數(shù)可從任意處跳回 好多年不用C51 了 具體情況記不清了 |
|
| 52樓: | >>參與討論 |
| 作者: thinkey 于 2006/2/23 9:47:00 發(fā)布:
寫錯了,nnd (*(void * ())ll) () |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |