[問題] 加了cout 就不會segmentation fault 不加就會=.= ????

看板C_and_CPP作者 (~"~)時間14年前 (2011/05/25 21:42), 編輯推噓6(6033)
留言39則, 10人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux g++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) #include <algorithm> 問題(Question): 一個程式加了cout 就不會segmentation fault 不加就會= = 餵入的資料(Input): 3 4087 2750 12768 9085 12061 32226 17544 25090 21184 預期的正確結果(Expected Output): 跑完 錯誤結果(Wrong Output): segmentation fault 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> #include <vector> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; class Tower{ public: int x; int y; int z; Tower(int a,int b,int c):x(a),y(b),z(c){} }; // 把所有可能都push 到vector V 裡面 void permu(Tower a,vector<Tower> & V){ int x,y,z; x=a.x; y=a.y; z=a.z; V.push_back(Tower(x,y,z)); V.push_back(Tower(x,z,y)); V.push_back(Tower(y,x,z)); V.push_back(Tower(y,z,x)); V.push_back(Tower(z,x,y)); V.push_back(Tower(z,y,x)); return ; } //sort 的 compare function bool cmp(Tower l , Tower r){ if(!(l.x<r.x && l.y<r.y)) return true; return false; } // overload < bool operator<(Tower l ,Tower r){ if(l.x<r.x&&l.y<r.y)return true; return false; } //DP int LIS(vector<Tower> V,int N){ int i,j,k; int max[N+2]; int ans=-100; for(i=0;i<N;i++) max[i] = V[i].z; for(i=0;i<N;i++){ for(j=0;j<i;j++){ if((V[i] < V[j])){ max[i]=max[j]+V[i].z; } } } for(i=0;i<N;i++) if(max[i] > ans) ans=max[i]; return ans; } // main program int main(){ int i,j,k; int T,N; int n,l,m; int in_x,in_y,in_z; int Case=1; vector<Tower> V; while(scanf("%d",&n)==1){ if(n==0)break; V.clear(); for(i=0;i<n;i++){ cin >> in_x >> in_y >> in_z; Tower a(in_x,in_y,in_z); permu(a,V); } // cout <<"Before Sort!!! "<<endl; sort(V.begin(), V.end(),cmp); int ans = LIS(V,V.size()); printf("Case %d: maximum height = %d\n",Case++,ans); } return 0; } 補充說明(Supplement): 這是ACM437的題目 用LIS解 丟上去一個RE =.= 不過這不是重點 重點是我在測這個測資的時候 3 4087 2750 12768 9085 12061 32226 17544 25090 21184 沒加紅色的那一段code 就會segmentation fault 加了就不會了 可以正常的跑完 不知道這到底是怎麼回事= = 不就只是個cout 而已= = 是說我以前也有遇過這樣的狀況 不過還是無法理解 是跟buffer 有關的嗎? 謝謝回答@@@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.244.131

05/25 21:45, , 1F
你可以用 debugger 看 ... 會 segmentation fault 的
05/25 21:45, 1F

05/25 21:45, , 2F
很好抓 ...
05/25 21:45, 2F

05/25 21:59, , 3F
重點是+cout就沒事= =
05/25 21:59, 3F

05/25 22:00, , 4F
就一命二運三風水
05/25 22:00, 4F

05/25 22:06, , 5F
未定義行為?
05/25 22:06, 5F

05/25 22:11, , 6F
???
05/25 22:11, 6F

05/25 22:18, , 7F
用gdb去找理由吧,不過gdb對stl沒有直接支援,你要先去找
05/25 22:18, 7F

05/25 22:18, , 8F
到文章
05/25 22:18, 8F

05/25 22:29, , 9F
我無法了解的是cout 會有甚麼影響...-.-
05/25 22:29, 9F

05/25 22:50, , 10F
我無法理解的是為什麼叫你去用 debugger 看就能理解, 而你
05/25 22:50, 10F

05/25 22:50, , 11F
卻一直不去看在那邊一直問 =,=
05/25 22:50, 11F

05/25 22:54, , 12F
就程式剛好那樣就給你過了 如此而已
05/25 22:54, 12F

05/25 22:55, , 13F
以前遇過類似情況 簡單來說 就是其它地方有錯..
05/25 22:55, 13F

05/25 22:56, , 14F
只是莫明奇妙的那樣寫就過 但不可能交這樣的程式出去呀..
05/25 22:56, 14F

05/25 22:59, , 15F
to y 大 其實是因為我不會用 所以才問
05/25 22:59, 15F

05/25 22:59, , 16F
網路上一定可以找到 gdb 的教學
05/25 22:59, 16F

05/25 22:59, , 17F
是今天因為那行是cout 不是其他 所以才很疑惑
05/25 22:59, 17F

05/25 22:59, , 18F
如果你Linux有視窗介面的話,也可以用ddd
05/25 22:59, 18F

05/25 23:01, , 19F
建議你不要再執著於cout,把程式真正的問題找出來吧
05/25 23:01, 19F

05/25 23:01, , 20F
這有什麼,以前 VC 中斷點失效的時候,我加個 Enter 重編
05/25 23:01, 20F

05/25 23:02, , 21F
譯個 n 次就能恢復正常,比 cout 還威
05/25 23:02, 21F

05/25 23:02, , 22F
失效就是明明有加中斷點,但沒有停下來
05/25 23:02, 22F

05/25 23:03, , 23F
所以是啥原因= =?
05/25 23:03, 23F

05/25 23:03, , 24F
通常 segmentation fault 是記憶體的存取問題
05/25 23:03, 24F

05/25 23:03, , 25F
最常見的是陣列越界存取
05/25 23:03, 25F

05/25 23:25, , 26F
這種情況 就算你知道為什麼 還是要去找其它地方的問題
05/25 23:25, 26F

05/25 23:27, , 27F
我現在是不知道為什麼 剛剛用了gdb 啥都看不出來*.*
05/25 23:27, 27F

05/25 23:37, , 28F
看到code路過問一下, C++支援VLA了嗎?_?
05/25 23:37, 28F

05/25 23:45, , 29F
c99都支援了...
05/25 23:45, 29F

05/25 23:46, , 30F
我猜是compiler做了不可預期的事情...
05/25 23:46, 30F

05/25 23:48, , 31F
因為記得以前看過的文章寫, C99有VLA, 但C++尚未加入.
05/25 23:48, 31F

05/25 23:48, , 32F
只是小弟沒有在追spec, 所以才想偷懶直接問一下XD
05/25 23:48, 32F

05/25 23:49, , 33F
我之前在cpp用VLA很歡樂了的說XDDD
05/25 23:49, 33F

05/25 23:52, , 34F
我必需說...我用dev-c++跑 沒加cout也很高興的過了呀
05/25 23:52, 34F

05/25 23:52, , 35F
感謝f大 這就是我想聽到的答案類型XD
05/25 23:52, 35F

05/26 00:03, , 36F
加上 -pedantic ... 你會發現到 c++0x 都沒 VLA
05/26 00:03, 36F

05/26 00:17, , 37F
dos2unix試看看?
05/26 00:17, 37F

05/26 08:36, , 38F
~"~都跟你說gdb沒有直接支援stl的輸出,都叫你先去找如何
05/26 08:36, 38F

05/26 08:37, , 39F
讓gdb可以看到stl的結果了,
05/26 08:37, 39F
文章代碼(AID): #1DtGTG0a (C_and_CPP)