[問題] 寫C遇到的奇怪bug

看板C_and_CPP (C/C++)作者 (森)時間16年前 (2010/03/30 12:08), 編輯推噓4(4040)
留言44則, 9人參與, 最新討論串1/1
想請問各位前輩 在跑程式的時候有沒有遇到過 就是code真的合情合理 但是跑出來就是會跟你不一樣 然後結果是用很匪夷所思的方法才解決掉bug的經驗 比如說 (以下是自己大概的語意 實際上更複雜一些) for(i=0;i<n;i++) { array[i]=array[i]+1; temp=array[i]%2; array[i]=temp; if (temp==1) k='a'; else k='b'; } 結果當有一個跟他毫無瓜葛的變數S<y之後 我print出來的array[i]跟k就會對應錯誤 我這樣寫其實很多餘 結果改成 for(i=0;i<n;i++) { array[i]=array[i]+1; array[i]=array[i]%2; if (array[i]==1) k='a'; else k='b'; } 就沒有再對應錯誤 就是很鬼打牆的經驗 請問各位前輩有遇過這類的事情嗎? 小弟我是用Dev-c++ 還是基本上一定是我自己哪裡出問題了 不好意思 如果是我自己太蠢我會自D的 感謝各位收看 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.108.73 ※ 編輯: aaaaaaason 來自: 59.104.108.73 (03/30 12:09)

03/30 12:10, , 1F
什麼叫對應錯誤?
03/30 12:10, 1F

03/30 12:12, , 2F
就是array[i]==1 可是k='b'
03/30 12:12, 2F

03/30 12:29, , 3F
當然有啊,寫C程式經常是有一堆side-effect呀
03/30 12:29, 3F

03/30 12:34, , 4F
能否請問您對side-effect的定義是
03/30 12:34, 4F

03/30 12:35, , 5F
另外對於這類的問題排除有甚麼特別的心得或方法嗎
03/30 12:35, 5F

03/30 12:36, , 6F
先感謝以上兩位的幫助
03/30 12:36, 6F

03/30 12:41, , 7F
使用 debugger trace 一下吧,或是貼上完整程式碼
03/30 12:41, 7F

03/30 12:54, , 8F
推樓上:)
03/30 12:54, 8F

03/30 13:11, , 9F
貼上完整程式碼是只貼在板上嗎?? 不好意思問了笨問題
03/30 13:11, 9F

03/30 13:11, , 10F
debugger 是指程式內建的除錯功能嗎??
03/30 13:11, 10F

03/30 13:18, , 11F
http://0rz.tw/IhgZy debugger是類似這樣的東西
03/30 13:18, 11F

03/30 13:18, , 12F
讓你可以慢慢觀察程式的行為
03/30 13:18, 12F

03/30 13:18, , 13F
至於貼程式碼 置底文有些網站可以利用
03/30 13:18, 13F

03/30 13:33, , 14F
是貼在板上沒錯,我仔細看過你貼出的 code 了,錯誤不在那
03/30 13:33, 14F

03/30 13:34, , 15F
另外我認為你應該敘述清楚程式邏輯,array[i]奇數時k='a'之類
03/30 13:34, 15F

03/30 13:46, , 16F
謝謝t大 因為程式蠻長的所以只有摘露部分意思
03/30 13:46, 16F

03/30 13:47, , 17F
主要是想知道這種是不是大多數還是自己寫程式的壞習慣
03/30 13:47, 17F

03/30 13:48, , 18F
也謝謝j大的幫助!!
03/30 13:48, 18F

03/30 13:56, , 19F
side-effect不需要定義,只要你粗心一點沒想好你在寫什麼,
03/30 13:56, 19F

03/30 13:57, , 20F
程式的真正意思對你來說就存在著side-effect.
03/30 13:57, 20F

03/30 13:57, , 21F
當然書上也會告訴你普通的side-effect意思是什麼,只看你有沒
03/30 13:57, 21F

03/30 13:58, , 22F
有看到書了那些段落,把觀念養好了.
03/30 13:58, 22F

03/30 15:10, , 23F
bug 應該在你沒貼出來的部份,你現在不解決,他會變得更嚴重
03/30 15:10, 23F

03/30 15:43, , 24F
T大您好 以下是我的程式
03/30 15:43, 24F
※ 編輯: aaaaaaason 來自: 140.114.26.106 (03/30 15:45)

03/30 15:48, , 25F
發出來想一想發現可能很難跟您解釋問題部分在哪裡...
03/30 15:48, 25F

03/30 16:00, , 26F
其實我剛剛看到 code 了,我認為問題出在 #132 那個 while
03/30 16:00, 26F

03/30 16:00, , 27F
03/30 16:00, 27F

03/30 16:01, , 28F
很感謝各位以及tkcn大大的幫忙
03/30 16:01, 28F

03/30 16:01, , 29F
你應該使用 debugger 或著自己塞一堆 printf,去觀察各變數和
03/30 16:01, 29F

03/30 16:01, , 30F
但我可能寫的很亂 大家看不下去也別見怪了謝謝
03/30 16:01, 30F

03/30 16:02, , 31F
執行流程是否跟你所預期的一樣
03/30 16:02, 31F

03/30 16:03, , 32F
嗯我上面這個有加註問題還有我是如何解決問題
03/30 16:03, 32F

03/30 16:04, , 33F
while裡面的流程 當照內文所說的修改後看似無誤了
03/30 16:04, 33F

03/30 16:04, , 34F
只是不太明白問題出在哪裡
03/30 16:04, 34F

03/30 16:06, , 35F
看你想要解決了就算了 還是真的找出原因囉...
03/30 16:06, 35F

03/30 16:09, , 36F
當然要找出原因! 冷靜下來仔細思考吧。 我也還沒看出問題
03/30 16:09, 36F

03/30 16:10, , 37F
我應該會試試看debugger找出問題
03/30 16:10, 37F

03/30 16:11, , 38F
各位板大真的很熱心...謝謝大家...
03/30 16:11, 38F

03/30 17:44, , 39F
array[i]=temp 改成temp=array[i]
03/30 17:44, 39F

03/30 17:45, , 40F
你temp又沒有給他值還拿去做if
03/30 17:45, 40F

03/31 01:16, , 41F
我還遇過debugger單步跑OK,不單步跑就炸掉的
03/31 01:16, 41F

03/31 01:17, , 42F
結果原因是變數的初始化設定沒弄好...
03/31 01:17, 42F

03/31 01:18, , 43F
gdb單步跑的時候似乎會幫把垃圾清掉所以單步跑就一切正常
03/31 01:18, 43F

04/01 23:30, , 44F
應該是array寫入超過當初malloc的大小了吧
04/01 23:30, 44F
文章代碼(AID): #1BiNajur (C_and_CPP)
文章代碼(AID): #1BiNajur (C_and_CPP)