音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

C程序的任意跳轉(zhuǎn)

作者:wenfengcom 欄目:單片機
C程序的任意跳轉(zhuǎn)
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
你的要求真是奇怪。
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
直接
我的程序中不能這樣跳,要求直接在MAX中跳到LL,用指針函數(shù)可以跳,但是多次將會堆棧溢出,
void (*p)();
void max()
{
   if(SomeThing==True)
   {
      p=ll;
      p();

   }
   .
   ;
   

}
多次將導致堆棧溢出,因為MAX有壓棧沒有出棧

4樓: >>參與討論
computer00
那你干脆用匯編寫算了。這不是用C語言寫程序的思路。
 
5樓: >>參與討論
Bingoes
那為何非得將max定義成函數(shù)呢?
何不
max:
   if(something==true)
      goto ll;
   。。。。。
你即使用匯編,在子程序中直接返回到主程序,
也會存在堆棧的問題啊,不過在匯編中可以手
動釋放,如連續(xù)執(zhí)行兩條POP ACC指令;但在
C中有沒執(zhí)行POP的指令,我就不清楚了

6樓: >>參與討論
夏蟲
你為什么不寫成這樣呢?
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
不行
MAX前面還有要執(zhí)行了,問題是MAX退出的時候怎樣處理堆棧?

8樓: >>參與討論
dyidtm
他是想遞歸調(diào)用吧,這樣資源會給你用光甚至無法用。
 
9樓: >>參與討論
computer00
那你就強行修改堆棧內(nèi)容,然后return。
 
10樓: >>參與討論
夏蟲
暈~~
這么麻煩,就不如用匯編寫了,強行更改堆棧難免不出問題

11樓: >>參與討論
xwj
這樣,不過規(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
不是這樣
我希望是能直接在MAX中跳,不要調(diào)用后在GOTO ,MAX可能在被其它的函數(shù)調(diào)用,調(diào)用后能直接跳到LL,,我用指針函數(shù)實現(xiàn),但有堆棧溢出問題

13樓: >>參與討論
computer00
真是暈。那就直接修改堆棧指針,然后使用return返回。
這樣一返回就返回到你要的那個地方了。

14樓: >>參與討論
楊工
不建議這樣goto
goto確實不可避免,但是一般只用在在函數(shù)內(nèi)部。
我看你的程序,只要采用一般設計主程序的大循環(huán)的思路就可以解決。
如果勉強實現(xiàn)你的思路,可讀性會很差。

15樓: >>參與討論
ketp
-
想任意跳轉(zhuǎn)就只有用 setjmp,longjmp了。

16樓: >>參與討論
xwj
唉,lv子不可教也,懶得說了。computer00說得很明白了
還要大家怎么說。


樓主自己去玩“高級”技巧吧,我們就瞎別摻合了

17樓: >>參與討論
coldra
想不出什么地方需要這樣的跳轉(zhuǎn)
其實在C語言中goto語句完全可以不用,一個良好的程序設計結(jié)構(gòu),不需要這樣的跳轉(zhuǎn)的,任何函數(shù)都要完整的執(zhí)行完,可以利用返回變量確定下一步要怎么辦,從一個函數(shù)中強行跳出看似直接,可是會帶來很多問題,處理起來反而會麻煩,可讀性差,給后續(xù)維護帶來很多障礙。

所以樓主還是放棄這種思路,如果函數(shù)中間需要跳轉(zhuǎn)出去,那么就請?zhí)皆摵瘮?shù)出口處自然退出,并返回一個返回值,出去后再判斷如何跳轉(zhuǎn)吧。

18樓: >>參與討論
李冬發(fā)
你的設計思想有嚴重問題,請放棄這個想法!
 
19樓: >>參與討論
sun0_liang
我提一個方法:
先在主程序main中保存sp的值spx;在子程序max中需要跳至ll的地方
{
  恢復spx;
  goto ll;
}


* - 本貼最后修改時間:2006-1-17 15:54:11 修改者:sun0_liang

20樓: >>參與討論
cuiwei0513
這樣做
想辦法把max
return  


21樓: >>參與討論
wenfengcom
我也這樣想的
可是return和(*P)()不能同時執(zhí)行,要是都能執(zhí)行就好了,指針函數(shù)用于任意跳轉(zhuǎn),return用于出棧

22樓: >>參與討論
夏蟲
想不出還有什么更奇怪的思路了
樓主,你要解決了告訴大家一聲,謝了

23樓: >>參與討論
computer00
如果是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
可以用stjmp()
 
25樓: >>參與討論
Mr_Right
setjmp()與longjmp()
goto只能實現(xiàn)本地跳轉(zhuǎn),而setjmp()與longjmp()的組合運用,能有效的實現(xiàn)程序控制流的非本地(遠程)跳轉(zhuǎn);


26樓: >>參與討論
guoshoujin
答復
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樓: >>參與討論
陳遠征
同意樓上guoshoujin的看法哈
 
28樓: >>參與討論
不起眼
ketp說的對
想任意跳轉(zhuǎn)就只有用 setjmp,longjmp了,這兩個函數(shù)是專門解決這類問題的,可以完成函數(shù)間跳轉(zhuǎn),而不產(chǎn)生堆棧溢出。
    其原理是先在返回點使用setjmp,保存SP/PC到一個buf.
    再在跳轉(zhuǎn)點使用longjmp

    順便說一句,使用他們可以簡化程序結(jié)構(gòu)。

29樓: >>參與討論
cxd731
倒死……
 
30樓: >>參與討論
zqz198312
用匯編就不會這么麻煩哦
我認為用匯編會簡單的多哦

31樓: >>參與討論
滌綸
回復
  不如樓主你就直接把你想做的東東說出來,讓大家?guī)湍銓憘程序得了。

32樓: >>參與討論
fushaobing
勸樓主不要誤入歧途
你要考慮的不應該是“C程序的任意跳轉(zhuǎn)”,而是如何避免在C程序中任意跳轉(zhuǎn)。軟件發(fā)展到現(xiàn)在已經(jīng)是一門比較成熟的科學,有它自身的一些規(guī)律,你不要任意去踐踏這些規(guī)律。

33樓: >>參與討論
dujb
C語言中有標準的函數(shù)
利用函數(shù) setjmp() 和getjmp() 來實現(xiàn),具體的方法可以看C參考

34樓: >>參與討論
gouki_s
setjmp()
不過別在中斷里跳出來。

35樓: >>參與討論
fsclub
樓主的C編程思想根本就是錯誤的,
想用匯編的思想來寫C程序.

36樓: >>參與討論
天樂
不要清看門狗,直接返回
 
37樓: >>參與討論
楊工
同意fushaobing
如果寫一段防止別人跟蹤的程序,可以采取樓主的思路,讓人不易看懂。

38樓: >>參與討論
zxwwwwcom
要想任意跳轉(zhuǎn),用OS算了,想跳到那里都可以哈
 
39樓: >>參與討論
aoshi
re
修改堆棧是比較好的方法了,goto估計不適合,

40樓: >>參與討論
陳林海
C程序的任意跳轉(zhuǎn)
用T0中斷就可以了

41樓: >>參與討論
將軍令
用setjmp和longjmp,可以任意跳躍
 
42樓: >>參與討論
tzfzephyr
這位大哥。
你想實現(xiàn)什么功能,把問題說出來,讓大家看看有沒有那么折騰的必要。

43樓: >>參與討論
rivita
算法存在問題
您應該從自身找找,您的算法就存在著致命的危險,不是不行但不提倡,可以用C嵌匯編來寫,就象寫潛入式系統(tǒng)那樣做,有空看看軟件工程您就明白了。

44樓: >>參與討論
jacy1233
C程序的任意跳轉(zhuǎn)
用語句調(diào)用啊

45樓: >>參與討論
電子塵埃
這首歌,好好聽噢,叫什么歌名呀
 
46樓: >>參與討論
thinkey
管別人用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
這好象是一個通訊協(xié)議的判斷
遇到過相似的問題,可用嵌套的do{}while(),前面有人已說了

48樓: >>參與討論
豬一樣理想
如果調(diào)用函數(shù)也可以這樣
((void(*)(void))ll)();

49樓: >>參與討論
thinkey
一定要這樣的話,我覺得是
(*(void * ())0) ()



50樓: >>參與討論
leezgnj
去翻翻書 Keil
 
51樓: >>參與討論
leezgnj
去看看Keil的庫函數(shù)
如果我沒記錯的話 Keil 的庫函數(shù)有這樣兩個函數(shù):
setenv()   longjump()  好像還涉及到一個 env的數(shù)據(jù)結(jié)構(gòu)

setenv() “l(fā)l”前面  根據(jù)參數(shù)可從任意處跳回

好多年不用C51 了 具體情況記不清了
 

52樓: >>參與討論
thinkey
寫錯了,nnd
(*(void * ())ll) ()


參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
問一個單片機I/O口的三態(tài)問題??
求助
請教AT89c2051_p1.0,p1.1接成ADC,等阻分壓后p1.0還是5V?
請問有沒有比7408與門數(shù)量多的芯片?
(求助) C語言高手請進
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號