[問題] 迴圈的問題消失

看板C_and_CPP作者時間9年前 (2017/01/05 23:37), 9年前編輯推噓4(4020)
留言24則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) win7 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no 問題(Question): 在練習用malloc寫程式 基本上就是寫一個找質數的程式而已 課本的範例是定義一個陣列prime[500] 我改成用malloc來寫這個陣列 基本上所有問題都解決了可是for迴圈的部分我寫的跟題目的有兩個地方不一樣 而且還不能改 一改程式就出問題跑不下去 餵入的資料(Input):預期的正確結果(Expected Output): 執行次數 14622次 錯誤結果(Wrong Output): 執行次數 14788次 程式碼(Code):(請善用置底文網頁, 記得排版) 我寫的code: http://ideone.com/c4b2tF 課本範例的code: http://ideone.com/bddz7K 補充說明(Supplement): 在ide上不能跑不知道是不是因為malloc的關係 不過我在自己電腦上用cmd執行沒有問題 想請各位前輩指點一下 感恩 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 66.86.130.129 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1483630675.A.FAF.html ※ 編輯: nikuman (66.86.130.129), 01/05/2017 23:40:43

01/05 23:47, , 1F
if(ptr==i) 你包在 for(int i...) 的迴圈裡了
01/05 23:47, 1F

01/05 23:48, , 2F
注意看範例裡這個判斷是在 for(int i...) 的外面
01/05 23:48, 2F

01/05 23:48, , 3F
範例程式裡這迴圈是 17~21 行, 但你的卻是 17~25 行
01/05 23:48, 3F

01/05 23:49, , 4F
建議以後的改進方向: { 和 } 適當內縮以表示它是哪一層
01/05 23:49, 4F

01/05 23:50, , 5F
例如範例 21 行那個 } 縮進去表示那是跟它同層的 17 行一組
01/05 23:50, 5F

01/05 23:59, , 6F
跟 malloc 無關,就純粹是你寫錯而已
01/05 23:59, 6F

01/06 00:00, , 7F
如上面所說,正確的縮排習慣可以幫助你感應到這個問題點
01/06 00:00, 7F
我有試過把這段包在最裡面的迴圈外面 因為怎麼寫都跑不出來(迴圈只跑不到一千次) 才乾脆把它包在裡面的 後來雖然迴圈能跑可是又有些地方跟我想的不太一樣 程式語言真是深奧.. 請問這兩種寫法會差很多嗎 我的想法是 那段程式只會在i == ptr的時候起作用 所以裡面外面的效果是一樣的 差別在寫在外面的話我必須在一開始就定義int i = 0

01/06 00:07, , 8F
問題點是在於你改成那樣後其他部份也會在 i==ptr 做事
01/06 00:07, 8F

01/06 00:08, , 9F
原先的寫法因為條件是 i < ptr 所以並不會有 i==ptr 這圈
01/06 00:08, 9F

01/06 00:09, , 10F
然後當那段進去之後, ptr 後移, 迴圈不知不覺就變長了
01/06 00:09, 10F

01/06 00:10, , 11F
(因為結束條件變大了) 所以 ideone 那裡才會 segfault
01/06 00:10, 11F
原來如此 我再思考一下 感謝回答^_^

01/06 00:12, , 12F
也是因為迴圈變長所以你才不得不加第二個 break
01/06 00:12, 12F

01/06 00:12, , 13F
你真的懂這個程式在做什麼嗎?
01/06 00:12, 13F

01/06 00:12, , 14F
有 bug 的時候不要隨機亂搬 code 試誤啊...
01/06 00:12, 14F
因為把ptr == i那行寫在外面 弄了很久程式都只會跑不到一千次 完全沒辦法把找到的下一個質數寫進陣列 我才改成把那行寫到最裡面的 也沒有隨機亂搬 就是改一點改一點看哪種方法可行 可是改到後面跟我原先的想法已經不一樣了 所以有一點像是找到正確答案之後再思考為什麼是這樣

01/06 00:15, , 15F
啊, 測了一下, ideone 那裡不是 segfault, 是 SIGFPE
01/06 00:15, 15F

01/06 00:15, , 16F
問題點仍然是因為你進了 i==ptr 這一圈
01/06 00:15, 16F

01/06 00:16, , 17F
所以取到了尚未賦值的 prime[ptr], 如果它正好是 0 就炸了
01/06 00:16, 17F

01/06 00:16, , 18F
SIGFPE 這東西基本上當做除零錯誤來看就是了
01/06 00:16, 18F
試著把ptr == i 那行寫到倒數第二層迴圈 看了好久 終於發現問題在哪了 因為之前寫for都習慣寫成 for(int i = 0; i<ptr; i++) 把int拿掉就可以正常執行了 只是不知道為什麼必須把int拿掉..

01/06 01:28, , 19F
在 C99 以前 for 迴圈不支援 宣告式
01/06 01:28, 19F

01/06 01:30, , 20F
問題不在這裡, 是因為你在迴圈外參照到 i 了
01/06 01:30, 20F

01/06 01:30, , 21F
你的寫法會讓這個 i 的生命週期只限在這個 for 裡
01/06 01:30, 21F

01/06 01:30, , 22F
所以一出去之後就沒有 i 了
01/06 01:30, 22F

01/06 01:31, , 23F
既然你要在迴圈外參照 i, 那麼就必須把宣告拉出去
01/06 01:31, 23F
原來如此! 長知識了 從來不知道宣告在for迴圈裏面會限制參數的範圍 感謝分享

01/06 01:35, , 24F
嗯嗯 我說錯了 問題在變數的作用域範圍才對
01/06 01:35, 24F
※ 編輯: nikuman (66.86.130.129), 01/06/2017 02:12:32
文章代碼(AID): #1ORcXJ-l (C_and_CPP)