[問題] fedora8的gcc跟dev-c++的gcc

看板C_and_CPP作者 (通訊唸到瘋掉XDD)時間13年前 (2010/12/29 16:16), 編輯推噓4(4077)
留言81則, 11人參與, 最新討論串1/1
開發平台(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)

12/29 16:27, , 1F
孩子你沒在所有路徑都 return
12/29 16:27, 1F

12/29 16:28, , 2F
IDE => code::blocks or eclipse
12/29 16:28, 2F

12/29 16:28, , 3F
這會有warning才對阿 XDD
12/29 16:28, 3F

12/29 16:29, , 4F
事實上無視 warning 的人還不少呢
12/29 16:29, 4F

12/29 16:38, , 5F
偷偷推一下:http://ppt.cc/6p(_ XDD
12/29 16:38, 5F

12/29 16:47, , 6F
@_@
12/29 16:47, 6F

12/29 16:51, , 7F
Dev-C++ 通常是 3
12/29 16:51, 7F

12/29 17:07, , 8F
沒有耶我在fedora8執行gcc沒有警告@@
12/29 17:07, 8F

12/29 17:07, , 9F
命令列打上 C:\Dev-Cpp\bin\gcc --version 版本就出來
12/29 17:07, 9F

12/29 17:15, , 10F
有了 3.4.2
12/29 17:15, 10F

12/29 17:17, , 11F
養成良好習慣 [工具] > [編譯器選項] > 勾選 [當呼叫
12/29 17:17, 11F

12/29 17:18, , 12F
編譯器時, 加入下列的命令] 打上 -Wall 或加其他選項
12/29 17:18, 12F

12/29 17:19, , 13F
有警告不看很糟内...
12/29 17:19, 13F

12/29 17:23, , 14F
有了 這樣真的有警告...... 之前都看不到...^^"
12/29 17:23, 14F

12/29 17:29, , 15F
沒看過這種警告...可以請教一下嗎~"~
12/29 17:29, 15F
用修改的方式問好了~ 很好奇耶 我想回傳的值的確是24 f8的gcc可以正確回傳 但是dev-c++的gcc卻不行 這樣真的是gcc版本的差別造成? 警告的地方 是不是因為我用遞迴 所以不能在停止條件的時候一直做回傳的動作? 回傳變數只能回傳一次 是這樣子嗎? 那我想要改這支程式的話 是不是只能用call by address傳主程式的c變數的位置到副程式中 直接控制主程式的c變數的內容值? 這樣做ok嗎? 還有沒有其他方法? 謝謝 ※ 編輯: wimax802 來自: 114.32.9.209 (12/29 17:44)

12/29 17:46, , 16F
跟遞迴無關, 你的 else 區塊跑完之後, 函式的回傳值
12/29 17:46, 16F

12/29 17:47, , 17F
是什麼? BTW, 你可以把 count 當成參數傳遞, 就不需要
12/29 17:47, 17F

12/29 17:48, , 18F
我記得之前有人發過類似的, 那時後有討論過 return 不正
12/29 17:48, 18F

12/29 17:48, , 19F
local static variable ... 然後沒有 call by address
12/29 17:48, 19F

12/29 17:48, , 20F
的說法 ...
12/29 17:48, 20F

12/29 17:48, , 21F
確時 compiler 的行為...不過結論是與其鑽這個不如程式好
12/29 17:48, 21F

12/29 17:49, , 22F
好寫, 不要在未定義行為上煩惱
12/29 17:49, 22F

12/29 17:53, , 23F
回l大 應該是call by reference...
12/29 17:53, 23F

12/29 17:56, , 24F
回u大 因為我怕因為gcc版本不同造成debug時有更多困擾...
12/29 17:56, 24F

12/29 17:57, , 25F
所以才很在意版本的差別
12/29 17:57, 25F

12/29 17:58, , 26F
那gcc 版本3跟4 編譯跟執行有差異很大嗎? 有的話可能
12/29 17:58, 26F

12/29 17:58, , 27F
我不能互用了@@ 要在找別的工具看看....
12/29 17:58, 27F

12/29 18:00, , 28F
code砍掉重練好了 比較不會有甚麼版本差異
12/29 18:00, 28F

12/29 18:01, , 29F
程式好好寫的話基本上不會有太大差異, 這裡有差的原因是
12/29 18:01, 29F

12/29 18:02, , 30F
你, 不是編譯器版本 (不過還是換個 IDE 吧, 新版沒壞處)
12/29 18:02, 30F

12/29 18:03, , 31F
重點是:請不要寫未定義的行為,會發生什麼事沒人知道
12/29 18:03, 31F

12/29 18:03, , 32F
我知道我的程式設計還很差 所以才要用debug工具啊
12/29 18:03, 32F

12/29 18:06, , 33F
剛剛在else裡面加上return之後的確警告就會沒了^^
12/29 18:06, 33F

12/29 18:08, , 34F
謝謝l大的提醒~
12/29 18:08, 34F

12/29 18:09, , 35F
請問j大 未定義的行為指的是什麼?
12/29 18:09, 35F

12/29 18:11, , 36F
你覺得else裡面沒有加return的話 他會發生什麼事?
12/29 18:11, 36F

12/29 18:15, , 37F

12/29 18:42, , 38F
C 只有 pass by value 啦 ...
12/29 18:42, 38F

12/29 20:45, , 39F
啊 又不對了XDDD 好吧 以後找時間重新念起....
12/29 20:45, 39F

12/29 20:46, , 40F
謝謝大家幫忙 感覺收獲很大 呵呵
12/29 20:46, 40F

12/29 20:48, , 41F
這篇程式我會在研究看看 改天還是沒解決再來請教^^"
12/29 20:48, 41F

12/29 20:51, , 42F
不知道還有沒有常見的warning 而又都是什麼意思呢?
12/29 20:51, 42F

12/29 20:52, , 43F
以前大一學c語言也是沒在研究warning 結果出來了就不理它
12/29 20:52, 43F

12/29 20:53, , 44F
結果出錯就換別的寫法 在寫不出來就放棄..... 囧rz
12/29 20:53, 44F

12/29 20:53, , 45F
warning都是英文 基本上肯看都不難了解吧= =???
12/29 20:53, 45F

12/29 20:53, , 46F
看不懂的話上google或msdn 找不到才去問
12/29 20:53, 46F

12/29 20:55, , 47F
可是知道字面意思卻不見得知道問題在哪耶....
12/29 20:55, 47F

12/29 20:56, , 48F
我相信google後無法解決的warning<20%
12/29 20:56, 48F

12/29 20:56, , 49F
這篇程式也是靠版有幫忙才知道在else裡面沒有回傳會出錯
12/29 20:56, 49F

12/29 20:57, , 50F
喔 @@ 我以前有google過一些error的問題是有解..
12/29 20:57, 50F

12/29 20:57, , 51F
不過這個警告 兩小時前去找好像沒有找到想要找的解答XDD
12/29 20:57, 51F

12/29 20:57, , 52F
warning: no return statement in function returning
12/29 20:57, 52F

12/29 20:58, , 53F
non-void 這一看就知道是"副程式中沒有回傳敘述"
12/29 20:58, 53F
回x大 我用gcc編譯得到的警告訊息是: 16 C:\Users\user\Desktop\test.c [Warning] control reaches end of non-void function 只有non-void function跟x大的一樣 其他....我看不懂 囧rz

12/29 20:58, , 54F
可能是當初基礎沒打好, 才會不懂編譯器講的名詞
12/29 20:58, 54F

12/29 20:59, , 55F
msdn...喔喔 等一下來找找
12/29 20:59, 55F

12/29 20:59, , 56F
warning是GCC編出來的結果 老大我初級英檢都過不了阿!!
12/29 20:59, 56F

12/29 21:00, , 57F
我學c語言的時候老師只說語法 很多東西沒有強調過
12/29 21:00, 57F

12/29 21:01, , 58F
所以很多問題都沒有重視 當然有部分是自己懶惰.....
12/29 21:01, 58F

12/29 21:01, , 59F
嗯..總之還是希望真的餵狗無果再問~"~
12/29 21:01, 59F

12/29 21:02, , 60F
可是副程式 我有在if的條件式後面給回傳所以我認為沒問題
12/29 21:02, 60F
※ 編輯: wimax802 來自: 203.73.235.244 (12/29 21:03)

12/29 21:06, , 61F
C 語言程設都翹課說 (  ̄ c ̄)y▂ξ
12/29 21:06, 61F
※ 編輯: wimax802 來自: 203.73.235.244 (12/29 21:13)

12/29 21:23, , 62F
http://ppt.cc/KJoG 找到這個 j大解釋完在看就很好懂了
12/29 21:23, 62F
又想到一個問題 我先解釋一下我這裡的狀況 首先因為我在某補習班學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)

12/29 21:56, , 63F
改用code::blocks吧 devC++可以丟了
12/29 21:56, 63F

12/29 22:06, , 64F
ok 馬上來用看看XDD
12/29 22:06, 64F

12/29 22:09, , 65F
Dev C++ 沒啥不好阿, 換個核心一樣能用
12/29 22:09, 65F

12/29 22:16, , 66F
沒有新版 gcc 容錯比較高這種事
12/29 22:16, 66F

12/29 22:21, , 67F
所以還是只能自己想辦法把程式寫對 不能光靠工具幫忙是吧
12/29 22:21, 67F
※ 編輯: wimax802 來自: 203.73.235.244 (12/29 22:22)

12/29 23:33, , 68F
code::blocks的除錯工具我不會用....~"~
12/29 23:33, 68F

12/30 00:08, , 69F
C::B的除錯工具說明:http://ppt.cc/0ogg
12/30 00:08, 69F

12/30 00:19, , 70F
謝謝j大的說明 不過我之前的問題是C::B不能停止debug 囧
12/30 00:19, 70F

12/30 00:20, , 71F
我按紅色的stop卻停不下來~"~ 在慢慢研究好了....
12/30 00:20, 71F

12/30 03:30, , 72F
以後可以加上 -Wall -Werror compiler option.....
12/30 03:30, 72F

12/30 11:19, , 73F
話說,fedora 8也好多年了
12/30 11:19, 73F

12/30 14:11, , 74F
-pedantic !!
12/30 14:11, 74F

12/30 23:34, , 75F
用-pedantic會連//都警告耶 XDD
12/30 23:34, 75F

12/30 23:35, , 76F
-pedantic 加上 -std=c99
12/30 23:35, 76F

12/31 08:49, , 77F
為什麼要用c99呢
12/31 08:49, 77F

12/31 09:29, , 78F
因為 c89 不能用 //
12/31 09:29, 78F

12/31 09:31, , 79F
visual studio最強
12/31 09:31, 79F

12/31 10:30, , 80F
是喔 我覺得code::blocks已經很神了 除非語法太誇張
12/31 10:30, 80F

12/31 10:30, , 81F
亂寫都會過 還能執行...@@ 邏輯錯誤除外....
12/31 10:30, 81F
文章代碼(AID): #1D6kvpDt (C_and_CPP)