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

是否可知道到某個 function 之前,己經,經過幾個function 呢??

答題得分者是:暗黑破壞神
jchuangjchuang
一般會員


發表:4
回覆:10
積分:2
註冊:2007-01-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-20 16:38:50 IP:61.222.xxx.xxx 訂閱
Dear all,

想請問一下

ex:

f<textarea class="cpp" rows="10" cols="60" name="code">void funA(void); void funB(void); void funC(void); void funA() { funB(); } void funB() { funC(); } void funC() { //當程式執行到此時,是否有辨法知道 //曾經run 過 main--->funA--->funB--->funC 呢?? } void main(void) { funA(); } 謝謝各位高手的解答。 </textarea>
編輯記錄
jchuangjchuang 重新編輯於 2007-06-20 16:45:42, 註解 無‧
wei7278
一般會員


發表:16
回覆:19
積分:12
註冊:2004-09-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-20 16:50:16 IP:218.167.xxx.xxx 訂閱
您好:
我想用debug就行了吧,讓它一行一行跑就看的出來了
不然就自己寫,用一個全域變數,每個function裡都讓它累加,到你需要的地方秀出來就行了
編輯記錄
wei7278 重新編輯於 2007-06-20 17:05:59, 註解 無‧
jchuangjchuang
一般會員


發表:4
回覆:10
積分:2
註冊:2007-01-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-20 17:05:35 IP:61.222.xxx.xxx 訂閱
我是想讓程式run 完後,自動印出所 run 過的function  ,主要是為了畫流程圖用的。
也謝謝您的建議。




===================引 用 wei7278 文 章===================
您好:
??????????? 我想用debug就行了吧,讓它一行一行跑就看的出來了
wei7278
一般會員


發表:16
回覆:19
積分:12
註冊:2004-09-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-20 17:11:39 IP:218.167.xxx.xxx 訂閱
那就在function裡面加上印出的程式就好,看你要怎麼印
這樣每跑過一個function就會印一次

===================引 用 jchuangjchuang 文 章===================
我是想讓程式run 完後,自動印出所 run 過的function? ,主要是為了畫流程圖用的。
也謝謝您的建議。




jchuangjchuang
一般會員


發表:4
回覆:10
積分:2
註冊:2007-01-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-20 17:29:39 IP:61.222.xxx.xxx 訂閱
Dear wei7278:

您這個方法是可以用,但是,因為是要畫流程圖用的,所以我是想寫個程式,讓程式run 完後,就把流圖畫好了,而不用自已再用手動的方
式對程式,再重新畫一篇。

我本來是想要要在function 的頭尾都加一個 printf 後,再想辨法prsing 出重覆的字串,

ex:

<textarea class="cpp" rows="10" cols="60" name="code">funA() { printf("funA") .... printf("funA") } funB() { printf("funB") ....... printf("funB") } funC() { printf("funC") ....... printf("funC") }</textarea>


但是總覺得有點麻煩,想請教是否有更好的方法?


===================引 用 wei7278 文 章===================
那就在function裡面加上印出的程式就好,看你要怎麼印
這樣每跑過一個function就會印一次

===================引 用 jchuangjchuang 文 章===================
我是想讓程式run 完後,自動印出所 run 過的function? ,主要是為了畫流程圖用的。
也謝謝您的建議。




wei7278
一般會員


發表:16
回覆:19
積分:12
註冊:2004-09-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-20 21:23:21 IP:59.124.xxx.xxx 訂閱
你可以舉例你想要的輸出嗎
不太懂你說的意思
jchuangjchuang
一般會員


發表:4
回覆:10
積分:2
註冊:2007-01-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-06-21 13:05:25 IP:211.21.xxx.xxx 訂閱
<textarea class="cpp" rows="10" cols="60" name="code"> void funA(void); void funB(void); void funC(void); void funD(void); void funE(void); void funF(void); void funA() { printf("funA"); funB(); printf("funA"); } void funB() { printf("funB"); funC(); printf("funB"); } void funC() { printf("funC"); //當程式執行到此時,是否有辨法知道 //曾經run 過 main--->funA--->funB--->funC 呢?? printf("funC"); } void funD() { printf("funD"); printf("funD"); } void funE() { printf("funE"); funcF(); printf("funE"); } void funF() { printf("funF"); printf("funF"); } void main(void) { printf("main"); funA(); funD(); funE(); printf("main"); } </textarea> 我本來是想用這個方法: 其結果為main==> funA==> funB==> funC==> funC==> funB==> funA==> funD==> funD==> funE==> funF==> funF==> funE==> main==> 再想辨法把它變成 main==> funA==> funB==> funC==> funD==> funE==> funF==> 如此一來,我就知道這段程式是由main開始,在main下有 funA,funB and funC,而在funA 裡面有funB,funB裡面有funC 之後就到了main下了 ..... 想請問一下,是否有特定的function 可用,或者有其它更好的方法與建議呢?
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-06-21 18:20:29 IP:211.22.xxx.xxx 未訂閱
寫起來很煩!這就好像在寫一個Compiler功能中的Call Stack(觀察呼叫堆疊的函數呼叫次序)!
建議的作法是,使用一個雙向串列連結來儲存函數呼叫的順序,就可以知道彼此前後的關係。
wei7278
一般會員


發表:16
回覆:19
積分:12
註冊:2004-09-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-06-21 18:33:05 IP:218.167.xxx.xxx 訂閱
很可惜我也不知道有什麼寫好的class可以用
我提供一個笨方法
<textarea class="cpp" rows="10" cols="60" name="code"> void funA(void); void funB(void); void funC(void); void funD(void); void funE(void); void funF(void); void funA() { printf("funA"); funB(); } void funB() { printf("funB"); funC(); } void funC() { printf("funC"); } void funD() { printf("funD"); } void funE() { printf("funE"); funF(); } void funF() { printf("funF"); } void main(void) { printf("main----->"); funA(); printf("----->"); funD(); printf("----->"); funE(); } </textarea>
每個function只要在頭印一次,不過在main裡每call一次function後印個分隔線之類的 這樣每個區塊就會有本身function及function裡call的function了 例如main -----> funA,funB,funC -----> funD -----> funE,funF
harpist
資深會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-06-21 18:35:52 IP:59.104.xxx.xxx 未訂閱
有沒有考慮直接輸出到檔案,流程圖要怎麼畫直接讀取檔案。
------
~§~迷時師渡,悟了自渡~§~
暗黑破壞神
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-06-21 18:57:13 IP:220.131.xxx.xxx 未訂閱
用一個 int space = 0;
#ifdef __PRINTFUNCTION__
infunc(char *functionname)
{
for (int i = 0; i < space; i )
printf(" ");
printf('in %s\n", functionname);
space = 2;
}

outfunc(char *functionname)
{
for (int i = 0; i < space; i )
printf(" ");
printf('out %s\n", functionname);
space -= 2;
}
#endif

functiona()
{
#ifdef __PRINTFUNCTION__
infunc("functiona");
#endif
......
#ifdef __PRINTFUNCTION__
outfunc("functiona");
#endif

}

用這樣處理掉不行嗎?

如果你不要印出,直接把 #define __PRINTFUNCTION__ 拿掉。交付時就不會有動作了。
jchuangjchuang
一般會員


發表:4
回覆:10
積分:2
註冊:2007-01-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-06-22 19:18:38 IP:211.21.xxx.xxx 訂閱
謝謝大家的幫忙,如果沒有現成的class可用,那我可能會偏向"暗黑破壞神"的方法,因為這個方法看起來比較容易parsing成我要的流程圖,謝謝各位。
qhbo
一般會員


發表:0
回覆:2
積分:0
註冊:2007-06-22

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-06-23 11:57:57 IP:125.77.xxx.xxx 訂閱
#include <stdio.h>

#define TRACE_FUNC 1
#if (TRACE_FUNC)
#define FUNC_IN printf("[ %s ] in.\n", __FUNC__)
#define FUNC_OUT printf("[ %s ] out.\n", __FUNC__)
#else
#define FUNC_IN
#define FUNC_OUT
#endif

int foo_b()
{
FUNC_IN;
// do something.
printf("b\n");
FUNC_OUT;
}

int foo_a()
{
FUNC_IN;
// do something.
foo_b();

FUNC_OUT;
}

int main(int argc, char* argv[])
{
foo_a();
return 0;
}

--- 试试这个吧.
------
common world.
jchuangjchuang
一般會員


發表:4
回覆:10
積分:2
註冊:2007-01-10

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-06-25 11:58:34 IP:211.21.xxx.xxx 訂閱
謝謝 qhbo

我知道在linux 上是用__FUNCTION__ 可印出function的名子,
沒想到C 也可以,謝謝您了。



===================引 用 qhbo 文 章===================
#include

#define TRACE_FUNC 1
#if (TRACE_FUNC)
??? #define FUNC_IN printf("[ %s ] in.\n", __FUNC__)
??? #define FUNC_OUT printf("[ %s ] out.\n", __FUNC__)
#else
??? #define FUNC_IN
??? #define FUNC_OUT
#endif

int foo_b()
{
??? FUNC_IN;
??? // do something.
??? printf("b\n");
??? FUNC_OUT;
}

int foo_a()
{
??? FUNC_IN;
??? // do something.
??? foo_b();

??? FUNC_OUT;
}

int main(int argc, char* argv[])
{
??? foo_a();
??? return 0;
}

--- 试试这个吧.
qhbo
一般會員


發表:0
回覆:2
積分:0
註冊:2007-06-22

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-06-26 14:26:53 IP:121.204.xxx.xxx 訂閱
不客气.

===================引 用 jchuangjchuang 文 章===================
謝謝 qhbo

我知道在linux 上是用__FUNCTION__ 可印出function的名子,
沒想到C 也可以,謝謝您了。
------
common world.
系統時間:2024-04-28 5:06:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!