看板 C_and_CPP 關於我們 聯絡資訊
小弟是C++程式新手 問題一 最近小弟用Dev V.4.9.9.2跑自己寫的程式 大概幾百行而已,不是很大的程式 然後昨天開始突然發生一件很怪的事 compile and run之後,會無法正常結束,或者根本就跑不出結果(直接當掉) 有時候重開機再來會變正常,但有時候卻又不正常 甚至本來正常的檔案,改個檔名之後,竟然也變不正常 搞得我快瘋了 一直檢查哪裡有錯 之後無意間把檔案換了個資料夾再執行,竟然就全部都正常了,改檔名也沒問題 然後把本來的資料夾刪掉,再重新建一個和本來同名的資料夾 再把檔案複製回去,一樣無法正常執行 真的是見鬼了,那個資料夾名稱有問題嗎?(資料夾名稱只有英文和數字而已) 連重開機之後都一樣ㄟ... 請問這是怎麼一回事阿? 問題二 我的程式拿到工作站上去跑 竟然有個vector裡面的值算出來會和在Dev V.4.9.9.2不一樣 vector是二維的 例如A[0]~A[N-1],N是從某個檔案讀進來的int A的值是由另外兩個vector算出來的 → A[x] = B[x].size() - C[x].size() (A B C都是二維) 我的寫法是: for(int x=0; x<=N; x++) { A[x].push_back (B[x].size() - C[x].size()); } 當中唯獨A[4]的值就是比Dev V.4.9.9.2的值 +1(很明顯的不正確) 然後其它的A[]值都和Dev V.4.9.9.2一樣 請問會發生這種事的可能原因是什麼呢? 反覆檢查程式,完全找不到哪裡有問題啊 QQ 以上 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.3.39
loveme00835:看迴圈, 你的A裝的似乎是 STL 容器喔! 有沒有筆誤? 08/13 23:17
ericinttu:clean build試試 08/13 23:20
Zoxge:A B C都是STL容器沒錯 是用vector 用法有錯嗎?? 08/13 23:29
loveme00835:A[x] = B[x].size() - C[x].size() (文字敘述) 08/13 23:30
loveme00835:A[x].push_back (B[x].size() - C[x].size()); (程式) 08/13 23:30
TroyLee:A[x].push_back 還是 A.push_back ? 08/13 23:30
loveme00835:前後不一致, 看起來A的型態就好像vector<vector<int>> 08/13 23:31
Zoxge:sorry打錯了,A B C都是二維,是vector<vector<int>>沒錯 08/14 00:13
Zoxge:是A[x].push_back,沒有打錯 08/14 00:13
※ 編輯: Zoxge 來自: 123.195.3.39 (08/14 00:14)
Zoxge:是不是我語法的使用有問題呢? 08/14 00:14
loveme00835:問題應該在 B[x].size() - C[x].size() 這邊, 在計算 08/14 00:15
Zoxge:我剛剛用cout去輸出,結果和我用ofstream輸出到檔案的不同!! 08/14 00:15
loveme00835:結果之前, 先檢查看看這些vector的大小有沒有錯掉吧 08/14 00:15
Zoxge:ofstream出來的是我要的東西 (在Dev 4.9.9.2裡) 08/14 00:16
Zoxge:但是" cout << B[x].size() - C[x].size(); " 整個完全是錯 08/14 00:16
loveme00835:那你把 cout 換成ofstream串流試試, 應該也是一樣的 08/14 00:17
loveme00835:錯誤, 原因應該是在你設定這些vector if vectors的時 08/14 00:18
loveme00835:候有出錯 08/14 00:18
Zoxge:但是 cout << B[x].size(); 和 cout << C[x].size(); 都是對 08/14 00:18
Zoxge:還有 cout << D[x][0]; 也是對的 08/14 00:19
Zoxge: A (上一行打錯) 08/14 00:20
loveme00835:是不是當 B[x].size() < C[x].size() , 算出來是錯的? 08/14 00:22
Zoxge:ofstream的結果和cout的結果是一樣的,錯同樣地方 08/14 00:23
loveme00835:隔空抓藥有點難, 有沒有更詳細點的程式碼? 還有檔案大 08/14 00:24
Zoxge:B[x].size() - C[x].size() 這個整個錯掉 08/14 00:24
loveme00835:概的內容 08/14 00:24
Zoxge:只有B[x].size() - C[x].size() = 0 (=A[x][0])的case是正確 08/14 00:25
loveme00835:因為vector::size()回傳的是一個非負整數, 所以小減大 08/14 00:25
Zoxge:B[x].size() - C[x].size() 不等於 0 的話,出來結果都錯的 08/14 00:25
loveme00835:是一定錯掉的, 除非你寫 (int)B[x].size() 再去算 08/14 00:26
Zoxge:前面加 (int) 是指轉成integer嗎? 那本來是什麼type呢? 08/14 00:27
loveme00835:本來是回傳size_type, 應該是unsigned long 08/14 00:29
Zoxge:請問size_type是指什麼呢? 08/14 00:30
loveme00835:只是 container 的一些 typedefs, 實際上應該是size_t 08/14 00:32
loveme00835:而這個size_t在不同平台上大小會不一樣 08/14 00:32
loveme00835:轉整數後有對嗎? 08/14 00:35
Zoxge:依大大的建議,前面加上(int) 08/14 00:36
Zoxge:(int)B[x].size() - (int)C[x].size() 是對的了 08/14 00:36
loveme00835:轉 int 還有一個限制, 就是size_t 通常會很大, 如果確 08/14 00:38
Zoxge:但是在工作站上... 08/14 00:38
loveme00835:定你 vector 的大小可以用 int 表示, 這樣轉才安全 08/14 00:38
Zoxge:A[x].push_back ((int)Bcount[x].size() - (int)Ccount[x]. 08/14 00:39
loveme00835:工作站上怎麼了? 08/14 00:39
Zoxge:size()中 唯獨x=4的case是錯的(變成0,正確應該-1) 08/14 00:40
Zoxge:其它case都是對的,為什麼會這樣呢? 08/14 00:41
Zoxge:這樣和本來沒加 (int) 一樣 (在工作站上沒變正確) 08/14 00:41
Zoxge:請問要如何確定我開的vector大小可以用int表示呢? 08/14 00:42
loveme00835:B[4].size()、C[4].size() 的值各是多少 08/14 00:43
loveme00835:通常都可以用int 表示啦, 因為到一定程度你的記憶體就 08/14 00:44
loveme00835:用光了@_@ 08/14 00:44
TroyLee:沒有人注意到 for 迴圈條件跟他文中有衝突嗎 @@a 08/14 00:46
Zoxge:B[4].size()=0 C[4].size()=1 08/14 00:46
loveme00835:先確定各自的值都對, 再來做計算比較好~~ 08/14 00:46
TroyLee:A[0] ~ A[N-1] 但是 for 迴圈是 x<=N 08/14 00:47
Zoxge:但是其它case也有是0和1這樣一樣的情況 只是x=4是錯 @@ 08/14 00:47
loveme00835:這是程式中印出來的結果? 08/14 00:48
Zoxge:阿 T大,我for loop改成x < N就對了耶!! 好感動 @@a 08/14 00:50
loveme00835:有沒有迴圈的全貌可以看? 08/14 00:50
loveme00835:= = 08/14 00:50
Zoxge:回l大 "程式中"是指什麼呢? 我是用cout和ofstream(結果相同) 08/14 00:51
loveme00835:跑陣列 index 我是建議用 != 來跑, 這樣換到跑迭代器 08/14 00:51
Zoxge:我會寫x<=N是因為當x是奇數時,要使它變成偶數才行 08/14 00:52
loveme00835:語法也沒有差, 也不用考慮啥時要 < 啥時要 <= 08/14 00:52
Zoxge:本來是另外用push_back來使A[N][0]=0 但我當時是想省這一行 08/14 00:53
loveme00835:那這樣你要改的應該是 N 而不是測試條件 08/14 00:53
Zoxge:所以改成 x<=N @@ 08/14 00:53
TroyLee:吃快弄破碗 08/14 00:54
loveme00835:所以你本來vector<vector<int>>, 裡面的vector是空的? 08/14 00:54
loveme00835:你想要偶數項為0奇數項用算的? 08/14 00:55
Zoxge:用!=會換到跑迭代器? 這個我不懂ㄟ @@a 什麼意思呢? 08/14 00:57
Zoxge:我有先設定一個 vector <int> D; 然後A.push_back (D); 08/14 00:58
Zoxge: ^ (B和C也有用) 08/14 00:59
Zoxge:我是要把N個東西分成兩組,兩組東西要一樣多 08/14 01:00
loveme00835:http://paste.plurk.com/show/293724/ 都是用 != 08/14 01:01
loveme00835:喔喔 還是不懂> <, 已經成功了就好, 希望你可以多了解 08/14 01:02
loveme00835:vector 的一些用法, 還有STL 其他函式的用途, 很多時 08/14 01:03
loveme00835:候都有現成的函式可以寫, 像是 08/14 01:04
loveme00835:vector<vector<int>> A( 1, vector<int>() ); 08/14 01:04
loveme00835:建構的時候, A裡面已經有一個vector<int>了, 不用再 08/14 01:05
loveme00835:push_back 08/14 01:05
Zoxge:喔喔 感謝您 其實push_back那個方法也是別人教我的 QQ 08/14 01:07
loveme00835:vector<vector<int>> A( 1, vector<int>( 1, 0 ) ); 08/14 01:07
Zoxge:我真的很新手 對STL容器很不熟 QQ 08/14 01:07
loveme00835:這樣在A[0][0] 的值就已經是 0 了 08/14 01:07
loveme00835:0.0 雖然很方便是沒錯啦, 但是沒有善用的話, 跑得慢寫 08/14 01:08
Zoxge:但我還是不懂 為什麼寫x<=N只會導致 x=4的case出現錯誤? 08/14 01:08
loveme00835:也慢 08/14 01:08
loveme00835:這要看編出來的組語才能說明了, 超出範圍的結果是難以 08/14 01:10
loveme00835:想像的 08/14 01:10
TroyLee:你的 N 該不會也等於 4 吧 08/14 01:14
Zoxge:用STL寫起來會比較快吧? 跑起來也比較快嗎? 08/14 01:14
Zoxge:N = 11 08/14 01:15
loveme00835:STL 主要包含了 containers 還有 algorithms, 我想還 08/14 01:16
loveme00835:有更多符合你需求的, 你卻純手工打造, 這樣就會寫比 08/14 01:17
TroyLee:應該說你的 input data 本身就不包含 A[N] 這個, 那會產生 08/14 01:17
TroyLee:什麼樣的錯誤都是無法預期的 08/14 01:17
loveme00835:較慢 08/14 01:18
loveme00835:用 vector::at , 他會幫你檢查索引有沒有超界, 超界會 08/14 01:21
loveme00835:丟例外讓你知道, 用operator[]他不會幫你檢查, 錯了也 08/14 01:21
loveme00835:不知道問題在哪 08/14 01:21
Zoxge:嗯嗯 感謝大大拔刀相助 <(_ _)> 08/14 01:21
TroyLee:沒辦法, 最近在推路平專案... 08/14 01:23
Zoxge:at不是用來指定某一格的值用的嗎? 08/14 01:24
Zoxge:為什麼在Dev 4.9.9.2和 工作站 會有不同的結果呢? 08/14 01:29
Zoxge:Dev C++是適合什麼時候使用的阿? 08/14 01:30
sunneo:適合在MS Windows95-XP年代 沒有程式開發的IDE時使用 08/14 02:07