2013-11-28 2 views
-1

Я пытался написать следующую программу для конкурса программирования (уже закончил). Тем не менее, я продолжаю получать ошибку SIGABRT. Я должен очистить все контейнеры, прежде чем запускать следующий тестовый пример. Что я должен проверить?Как избежать ошибок SIGABRT в C++?

Это, как я реализую код: http://discuss.codechef.com/questions/29659/lowsum-editorial

#include<stdio.h> 
#include<algorithm> 
#include<queue> 
#include<vector> 

using namespace std; 

class compare 
{ 
public: 
    bool operator()(int a, int b) 
    { 
     return a>b; 
    } 
}; 

int main() 
{ 
    int T,K,Q; 
    vector<int> A,B,q,nsum; 
    priority_queue<int, vector<int> , compare> PQ;  //min PQ 
    scanf("%d",&T); 

while(T--) 
{ 
    scanf("%d %d",&K,&Q); 

    A.resize(K); 
    B.resize(K); 
    q.resize(Q); 

    for(int i= 0;i<K;++i) 
     scanf("%d",&A[i]); 

    for(int i=0;i<K;++i) 
     scanf("%d",&B[i]); 

    int max_q=0; 

    for(int i=0;i<Q;++i) 
    { 
     scanf("%d",&q[i]); 
     if(q[i]>max_q) 
     max_q=q[i]; 
    } 

    sort(A.begin(),A.end()); 
    sort(B.begin(),B.end()); 

    while(!PQ.empty()) 
     PQ.pop(); 

    int j=0; 

    while(max_q > 0 && j < K) 
    { 
     for(int i=0;i<K;++i) 
      PQ.push(A[i]+B[j]); 

     max_q--; 
     j++;      //next element of B[] 
    } 

    while(!PQ.empty()) 
    { 
     nsum.push_back(PQ.top()); 
     PQ.pop(); 
    } 

    for(int j=0;j<Q;++j) 
     printf("%d\n",nsum[q[j]-1]); 

    nsum.clear(); 
} 
} 
+4

Вы пробовали работать в отладчике? –

+0

Данная тестовая версия отлично работает на моем ПК. Когда я подчиняюсь судье, я получаю ошибку. Это должен быть определенный тестовый пример, который вызывает его, и я не могу найти его самостоятельно. :(Каковы общие причины? – user2441151

+0

SIGABRT может поступать изнутри или снаружи программы, но обычно внутри. Запустите его в отладчике. Если функция 'abort()' находится в стеке вызовов, это означает, что она исходит изнутри программа, возможно, из-за ошибки программирования, приводящей к вызову runtime, вызывающему 'abort()'. – Ben

ответ

0

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

Сначала измените размер массива на 0. В противном случае изменение размера должно копировать содержимое, которое является общим в двух массивах, поэтому ему нужно будет сначала выделить новый массив entrie, скопировать все, а затем выпустить старый.

Также для таких вещей вы можете избавиться от изменения векторов у попрошайничества, чтобы справиться с самым большим возможным испытанием, а затем не трогать их снова.

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