看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++2010 問題(Question): 很抱歉我的問題難以描述,連除錯都莫名其妙 但是目前已經鎖定一些問題點,以下是原來會出錯的部分 std::ofstream fout; fout.open(filename); for (int i=0; i<n; i++) { fout << data[i]; } fout.close(); 基本上就只是這樣的東西而已 但不曉得為什麼,於何種條件會觸發也未知 (只能確定並非隨機) fout << data[i]; 的這一行在特定時機會莫名其妙造成程式中斷 不過只要在前面多一行 cout 就化解了,至少程式可以跑完了 std::ofstream fout; fout.open(filename); for (int i=0; i<n; i++) { std::cout << "\0"; // 多一行這樣的東西即可"繞過"問題 fout << data[i]; } fout.close(); 實在完全沒有頭緒要如何除錯? 類似的狀況還有,在某些情況下即便是這麼簡單的程式碼也會當掉: sprintf(str,"%.3f",data[i]); 但是前面多一行 std::cout << "\0"; 就又化解掉了! 這實在太奇怪,一定有什麼問題沒注意到才是 我認定 data[i] 這個陣列應該沒有問題 而且 data[i] 一定有數據 (不太可能是未正確初始化),也不可能無法存取 data[i] 況且就算遇到了 NaN 的數據,sprintf 或者 ofstream 仍然都可以處理 很想知道可能是什麼樣的問題? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.255.50.171
Feis:data[i] 的型態是甚麼? 01/09 06:06
logs:double* data; 動態宣告使用 data = new double[NUM]; 01/09 07:22
johnpage:Num等於n嗎? 01/09 08:03
shadow0326:十之八九是哪裡有未定義行為 01/09 13:34
debugger的提示是存取到不合法的區塊,但詳情我實在看不懂,無法在這裡提供出來
linotwo:你可以檢查 failbit,或是問題出在你沒打出來的部分。 01/09 16:37
linotwo:也可以試試看 cout << data[i] 能不能印出來 01/09 16:42
NUM = n cout << data[i] 也完全沒有問題! 因為還有其他的 function (在這些問題程式碼之前) 會把 data 中所有的資料全部拿來用 除了結果是完全正確以外,也沒有發現任何 NaN、或者未定義數值的影響。 我現在懷疑另一個問題: 假如其他的變數存取,ex: facet[] 另一個 double array 不小心存取到了範圍外的位置,比如 facet[-1],是否有機會造成這種問題? 但我可以確定的是 facet[-1] 怎麼樣也無法觸及 data[] 任何元素的位置。 換句話說,目前可以保證的是: data 這個 double array 裏頭的資料,自始至終沒有被「外力」不正常影響過。 ※ 編輯: logs 來自: 111.255.48.236 (01/09 18:07)
yvb:這種情況多半是未打出來的部分有問題, 而把 stack 或 01/09 18:25
yvb: data segment 弄亂了. 在此處當掉或化解方式都只是剛好而已. 01/09 18:26
Feis:其他的變數存取有機會造成這問題. 因為是未定義行為 01/10 12:26
Feis:你把其他的部分都註解掉試看看不就好了? 01/10 12:26