作者singlovesong (~"~)
看板C_and_CPP
標題[問題] 加了cout 就不會segmentation fault 不加就會=.= ????
時間Wed May 25 21:42:37 2011
開發平台(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