看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, Gcc, Linux, ...) dev-C++ 版本4.9.9.2 linux fedora8 gcc 額外使用到的庫(Library Used) (Ex: OpenGL, ...) 問題(Question): dev-C++ ==>副程式的回傳值給主程式的c= 16384 linux fedora8 gcc ==>副程式的回傳值給主程式的c= 24 兩邊不同... 餵入的資料(Input): 副程式的count 預期的正確結果(Expected Output): 主程式的c= 24 錯誤結果(Wrong Output): 其中一個IDE無法回傳.... 程式碼(Code): (請善用置底文標色功能) #include <stdio.h> typedef struct node{ struct node *left; int data; struct node *right; }NODE; NODE H={NULL,80,NULL}; NODE I={NULL,90,NULL}; NODE D={&H,40,&I}; NODE F={NULL,60,NULL}; NODE G={NULL,70,NULL}; NODE B={&D,20,NULL}; NODE C={&F,30,&G}; NODE A={&B,10,&C}; int infix (NODE *h){ static int nNode=0,count=0; if(h==NULL) return (count); else { count++; infix(h->left); printf("step %d==>node%d: %3d\n",++count,++nNode,h->data); count++; infix(h->right); } } int main (void){ NODE *head=&A; int c=0; c=infix(head); puts("\n"); printf("number of node=%d\n",c); return 0; } 補充說明(Supplement): 我目前在用linux寫c的程式 但是因為功力太差 所以只好拿dev-C++來debug 本來以為兩邊都是gcc的compiler所以應該編譯跟執行都一樣 結果這個程式居然就失敗了.... 想請問大家為什麼會這樣? (會是gcc的版本不同的問題嗎? dev-C++的gcc版本要怎麼查? fedora8的gcc版本是4.1.2) 如果我想要debug fedora8下寫的c語言程式碼 有沒有推薦什麼工具 (可以安裝在xp上的IDE就好了 比較方便) 謝謝 希望沒有op -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.9.209 ※ 編輯: wimax802 來自: 114.32.9.209 (12/29 16:20)
akasan:孩子你沒在所有路徑都 return 12/29 16:27
akasan:IDE => code::blocks or eclipse 12/29 16:28
loveme00835:這會有warning才對阿 XDD 12/29 16:28
akasan:事實上無視 warning 的人還不少呢 12/29 16:29
james732:偷偷推一下:http://ppt.cc/6p(_ XDD 12/29 16:38
loveme00835:@_@ 12/29 16:47
legnaleurc:Dev-C++ 通常是 3 12/29 16:51
wimax802:沒有耶我在fedora8執行gcc沒有警告@@ 12/29 17:07
loveme00835:命令列打上 C:\Dev-Cpp\bin\gcc --version 版本就出來 12/29 17:07
wimax802:有了 3.4.2 12/29 17:15
loveme00835:養成良好習慣 [工具] > [編譯器選項] > 勾選 [當呼叫 12/29 17:17
loveme00835:編譯器時, 加入下列的命令] 打上 -Wall 或加其他選項 12/29 17:18
loveme00835:有警告不看很糟内... 12/29 17:19
wimax802:有了 這樣真的有警告...... 之前都看不到...^^" 12/29 17:23
wimax802:沒看過這種警告...可以請教一下嗎~"~ 12/29 17:29
用修改的方式問好了~ 很好奇耶 我想回傳的值的確是24 f8的gcc可以正確回傳 但是dev-c++的gcc卻不行 這樣真的是gcc版本的差別造成? 警告的地方 是不是因為我用遞迴 所以不能在停止條件的時候一直做回傳的動作? 回傳變數只能回傳一次 是這樣子嗎? 那我想要改這支程式的話 是不是只能用call by address傳主程式的c變數的位置到副程式中 直接控制主程式的c變數的內容值? 這樣做ok嗎? 還有沒有其他方法? 謝謝 ※ 編輯: wimax802 來自: 114.32.9.209 (12/29 17:44)
legnaleurc:跟遞迴無關, 你的 else 區塊跑完之後, 函式的回傳值 12/29 17:46
legnaleurc:是什麼? BTW, 你可以把 count 當成參數傳遞, 就不需要 12/29 17:47
uranusjr:我記得之前有人發過類似的, 那時後有討論過 return 不正 12/29 17:48
legnaleurc:local static variable ... 然後沒有 call by address 12/29 17:48
legnaleurc:的說法 ... 12/29 17:48
uranusjr:確時 compiler 的行為...不過結論是與其鑽這個不如程式好 12/29 17:48
uranusjr:好寫, 不要在未定義行為上煩惱 12/29 17:49
wimax802:回l大 應該是call by reference... 12/29 17:53
wimax802:回u大 因為我怕因為gcc版本不同造成debug時有更多困擾... 12/29 17:56
wimax802:所以才很在意版本的差別 12/29 17:57
wimax802:那gcc 版本3跟4 編譯跟執行有差異很大嗎? 有的話可能 12/29 17:58
wimax802:我不能互用了@@ 要在找別的工具看看.... 12/29 17:58
x000032001:code砍掉重練好了 比較不會有甚麼版本差異 12/29 18:00
uranusjr:程式好好寫的話基本上不會有太大差異, 這裡有差的原因是 12/29 18:01
uranusjr:你, 不是編譯器版本 (不過還是換個 IDE 吧, 新版沒壞處) 12/29 18:02
james732:重點是:請不要寫未定義的行為,會發生什麼事沒人知道 12/29 18:03
wimax802:我知道我的程式設計還很差 所以才要用debug工具啊 12/29 18:03
wimax802:剛剛在else裡面加上return之後的確警告就會沒了^^ 12/29 18:06
wimax802:謝謝l大的提醒~ 12/29 18:08
wimax802:請問j大 未定義的行為指的是什麼? 12/29 18:09
james732:你覺得else裡面沒有加return的話 他會發生什麼事? 12/29 18:11
james732:http://nopaste.csie.org/98988 12/29 18:15
legnaleurc:C 只有 pass by value 啦 ... 12/29 18:42
wimax802:啊 又不對了XDDD 好吧 以後找時間重新念起.... 12/29 20:45
wimax802:謝謝大家幫忙 感覺收獲很大 呵呵 12/29 20:46
wimax802:這篇程式我會在研究看看 改天還是沒解決再來請教^^" 12/29 20:48
wimax802:不知道還有沒有常見的warning 而又都是什麼意思呢? 12/29 20:51
wimax802:以前大一學c語言也是沒在研究warning 結果出來了就不理它 12/29 20:52
wimax802:結果出錯就換別的寫法 在寫不出來就放棄..... 囧rz 12/29 20:53
x000032001:warning都是英文 基本上肯看都不難了解吧= =??? 12/29 20:53
x000032001:看不懂的話上google或msdn 找不到才去問 12/29 20:53
wimax802:可是知道字面意思卻不見得知道問題在哪耶.... 12/29 20:55
x000032001:我相信google後無法解決的warning<20% 12/29 20:56
wimax802:這篇程式也是靠版有幫忙才知道在else裡面沒有回傳會出錯 12/29 20:56
wimax802:喔 @@ 我以前有google過一些error的問題是有解.. 12/29 20:57
wimax802:不過這個警告 兩小時前去找好像沒有找到想要找的解答XDD 12/29 20:57
x000032001:warning: no return statement in function returning 12/29 20:57
x000032001:non-void 這一看就知道是"副程式中沒有回傳敘述" 12/29 20:58
回x大 我用gcc編譯得到的警告訊息是: 16 C:\Users\user\Desktop\test.c [Warning] control reaches end of non-void function 只有non-void function跟x大的一樣 其他....我看不懂 囧rz
loveme00835:可能是當初基礎沒打好, 才會不懂編譯器講的名詞 12/29 20:58
wimax802:msdn...喔喔 等一下來找找 12/29 20:59
x000032001:warning是GCC編出來的結果 老大我初級英檢都過不了阿!! 12/29 20:59
wimax802:我學c語言的時候老師只說語法 很多東西沒有強調過 12/29 21:00
wimax802:所以很多問題都沒有重視 當然有部分是自己懶惰..... 12/29 21:01
x000032001:嗯..總之還是希望真的餵狗無果再問~"~ 12/29 21:01
wimax802:可是副程式 我有在if的條件式後面給回傳所以我認為沒問題 12/29 21:02
※ 編輯: wimax802 來自: 203.73.235.244 (12/29 21:03)
loveme00835:C 語言程設都翹課說 (  ̄ c ̄)y▂ξ 12/29 21:06
※ 編輯: wimax802 來自: 203.73.235.244 (12/29 21:13)
wimax802:http://ppt.cc/KJoG 找到這個 j大解釋完在看就很好懂了 12/29 21:23
又想到一個問題 我先解釋一下我這裡的狀況 首先因為我在某補習班學linux的c語言所以我要用fedora8寫程式 (未來要寫的kernal程式跟fedora8最接近) 而fedora8如果不用它內建的IDE編譯跟除錯的話 我不知道該怎麼用除錯工具(我們是在console下gcc編譯.c檔跟執行) 所以我才想要用dev-C++來幫我做除錯 剛好我安裝的dec-C++是4.9.9.2版 也就是gcc是第三版 fedora8的gcc是第四版 我的想法是說 新版的gcc應該是容錯的空間比較大 gcc 3版比4版嚴格 所以我用dev-C++來編譯跟執行ok的話 應該在fedora8也不會有問題 我這樣的想法對嘛 還是這兩版中間差異很大..... 這其實才是我一開始想問的問題~"~ 當然前提是如果我知道是自己的程式本身有瑕疵 我會想辦法改正.... 以前我都只是驗證結果正確就不管了 對細節不太注意.... 現在在回來看很多地方都變成報應了 囧rz ※ 編輯: wimax802 來自: 203.73.235.244 (12/29 22:04)
x000032001:改用code::blocks吧 devC++可以丟了 12/29 21:56
wimax802:ok 馬上來用看看XDD 12/29 22:06
loveme00835:Dev C++ 沒啥不好阿, 換個核心一樣能用 12/29 22:09
uranusjr:沒有新版 gcc 容錯比較高這種事 12/29 22:16
wimax802:所以還是只能自己想辦法把程式寫對 不能光靠工具幫忙是吧 12/29 22:21
※ 編輯: wimax802 來自: 203.73.235.244 (12/29 22:22)
wimax802:code::blocks的除錯工具我不會用....~"~ 12/29 23:33
james732:C::B的除錯工具說明:http://ppt.cc/0ogg 12/30 00:08
wimax802:謝謝j大的說明 不過我之前的問題是C::B不能停止debug 囧 12/30 00:19
wimax802:我按紅色的stop卻停不下來~"~ 在慢慢研究好了.... 12/30 00:20
fevg:以後可以加上 -Wall -Werror compiler option..... 12/30 03:30
james732:話說,fedora 8也好多年了 12/30 11:19
ledia:-pedantic !! 12/30 14:11
wimax802:用-pedantic會連//都警告耶 XDD 12/30 23:34
loveme00835:-pedantic 加上 -std=c99 12/30 23:35
wimax802:為什麼要用c99呢 12/31 08:49
nowar100:因為 c89 不能用 // 12/31 09:29
ken1325:visual studio最強 12/31 09:31
wimax802:是喔 我覺得code::blocks已經很神了 除非語法太誇張 12/31 10:30
wimax802:亂寫都會過 還能執行...@@ 邏輯錯誤除外.... 12/31 10:30