2014-10-09 5 views
-2

Я получаю ошибку времени выполнения, в чем причина этого? При удалении if (Px [size-1] .ele> a) ошибка исчезает! Я пробовал использовать только тогда, когда я равен нулю, и все же я получил ошибку!Что не так с этим кодом? Я получаю ошибку сегментации

#include <iostream> 
using namespace std; 
#define f(i,n) for(i=0;i<n;i++) 
#define f1(i,n) for(i=1;i<=n;i++) 
#define ll long long 
#define ld long double 
#define MOD 1000000007 
typedef struct{ 
    int ele; 
    int pos; 
    int sum; 
} vj; 
int main() 
{ 
    int n,size,sum,i,a; 
    vj Px[1000000]; 
    cin>>n; 
    size=sum=0; 
    f(i,n){ 
     cin>>a; 
     sum+=a; 
     while(size){ 
      if(Px[size-1].ele>a) 
       break; 
      size--; 
     } 
     Px[size].ele=a; 
     Px[size].pos=i+1; 
     Px[size].sum=sum; 
     size++; 
    } 
    //sum=P[0].ele*P[0].pos-P[0].sum; 
    //f(i,size-1) 
    // sum+=(P[i+1].ele*(P[i+1].pos-P[i].pos))-(P[i+1].sum-P[i].sum); 
    //cout<<size<<endl; 
    return 0; 
} 
+1

Что вам удалось сделать через программу отладчика? – Angew

+1

Почему вы используете эти уродливые маскирующие маски? – Deduplicator

+1

12M + в локальных переменных? Не удивительно, что вещи ломаются. – Deduplicator

ответ

2
typedef struct{ 
    int ele; 
    int pos; 
    int sum; 
} vj; 


int main() { 
    vj Px[1000000]; 
    ... 

это переполнение стека . MSVC имеет ограничение по умолчанию для размера стека 1 МБ. Вы рушится это ограничение.

Я предлагаю использовать распределение кучи вместо того, чтобы полагаться на локальные переменные стека этого размера.

+0

В 12x 1MB для этой локальной переменной это немного больше, чем удары. – Deduplicator

+0

Это своего рода «взлом полностью» –

+0

@ Дедупликатор Он «избивает» предел. – Barmar

Смежные вопросы