看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
legnaleurc:你可以用 debugger 看 ... 會 segmentation fault 的 05/25 21:45
legnaleurc:很好抓 ... 05/25 21:45
singlovesong:重點是+cout就沒事= = 05/25 21:59
purpose:就一命二運三風水 05/25 22:00
angleevil:未定義行為? 05/25 22:06
singlovesong:??? 05/25 22:11
angleevil:用gdb去找理由吧,不過gdb對stl沒有直接支援,你要先去找 05/25 22:18
angleevil:到文章 05/25 22:18
singlovesong:我無法了解的是cout 會有甚麼影響...-.- 05/25 22:29
yoco315:我無法理解的是為什麼叫你去用 debugger 看就能理解, 而你 05/25 22:50
yoco315:卻一直不去看在那邊一直問 =,= 05/25 22:50
a5480277:就程式剛好那樣就給你過了 如此而已 05/25 22:54
a5480277:以前遇過類似情況 簡單來說 就是其它地方有錯.. 05/25 22:55
a5480277:只是莫明奇妙的那樣寫就過 但不可能交這樣的程式出去呀.. 05/25 22:56
singlovesong:to y 大 其實是因為我不會用 所以才問 05/25 22:59
james732:網路上一定可以找到 gdb 的教學 05/25 22:59
singlovesong:是今天因為那行是cout 不是其他 所以才很疑惑 05/25 22:59
james732:如果你Linux有視窗介面的話,也可以用ddd 05/25 22:59
james732:建議你不要再執著於cout,把程式真正的問題找出來吧 05/25 23:01
purpose:這有什麼,以前 VC 中斷點失效的時候,我加個 Enter 重編 05/25 23:01
purpose:譯個 n 次就能恢復正常,比 cout 還威 05/25 23:02
purpose:失效就是明明有加中斷點,但沒有停下來 05/25 23:02
singlovesong:所以是啥原因= =? 05/25 23:03
james732:通常 segmentation fault 是記憶體的存取問題 05/25 23:03
james732:最常見的是陣列越界存取 05/25 23:03
a5480277:這種情況 就算你知道為什麼 還是要去找其它地方的問題 05/25 23:25
singlovesong:我現在是不知道為什麼 剛剛用了gdb 啥都看不出來*.* 05/25 23:27
VictorTom:看到code路過問一下, C++支援VLA了嗎?_? 05/25 23:37
firejox:c99都支援了... 05/25 23:45
firejox:我猜是compiler做了不可預期的事情... 05/25 23:46
VictorTom:因為記得以前看過的文章寫, C99有VLA, 但C++尚未加入. 05/25 23:48
VictorTom:只是小弟沒有在追spec, 所以才想偷懶直接問一下XD 05/25 23:48
firejox:我之前在cpp用VLA很歡樂了的說XDDD 05/25 23:49
a5480277:我必需說...我用dev-c++跑 沒加cout也很高興的過了呀 05/25 23:52
singlovesong:感謝f大 這就是我想聽到的答案類型XD 05/25 23:52
legnaleurc:加上 -pedantic ... 你會發現到 c++0x 都沒 VLA 05/26 00:03
SkyFluid:dos2unix試看看? 05/26 00:17
angleevil:~"~都跟你說gdb沒有直接支援stl的輸出,都叫你先去找如何 05/26 08:36
angleevil:讓gdb可以看到stl的結果了, 05/26 08:37