2013-12-13 74 views
-1

我一直在解決這個問題http://www.codechef.com/DEC13/problems/MARBLEGF/,我不明白爲什麼一次又一次得到運行時錯誤,任何人都可以請幫我這個嗎? 在此先感謝.. !!代碼如下: 以下代碼中運行時錯誤的原因是什麼?

#include<iostream> 
using namespace std; 
int main() 
{ 
    long long int n; 
    long int q; 
    int i,a,b,sum_temp=0,flag=0; 
    char act[10]; 

    cin>>n; 
    cin>>q; 

    int array[n],temp[n],temp2[n]; 
    long int sum; 
    for(i=0;i<n;i++){ 
     cin>>temp[i]; 
     temp2[i]=0; 
     array[i]=0; 
    } 
    while(q>0){ 
     for(i=0;i<3;i++){ 
      cin>>act[i]; 
     } 
     act[3]='\0'; 
     a=act[1]-'0'; 
     b=act[2]-'0'; 
     if(act[0]=='S'){ 
      if(array[b]==0){ 
       for(i=0;i<=b;i++){ 
        if(i>0){ 
         array[i]=array[i-1]+temp[i]; 
        }else{ 
         array[i]=temp[i]; 
        } 
       } 
      } 
      sum_temp=0; 
      for(i=a;i<=b && flag==1;i++){ 
       sum_temp=sum_temp+temp2[i];   
      } 
      if(a>0){ 
       sum=(array[b]-array[a-1])+sum_temp; 

      } 
      else{ 
       sum=array[b]+sum_temp; 
      } 

      cout<<sum<<endl; 

     } 
     else if(act[0]=='G'){ 
      temp2[a]=b; 
      flag=1; 
     } 
     else if(act[0]=='T'){ 
      temp2[a]=-b; 
      flag=1; 
     } 
     q--; 
    } 



    return 0; 

} 
+0

爲了增加您獲得答案的機會,我建議您更好地設置您的代碼格式,並嘗試更準確地描述錯誤。 –

+0

http://codepad.org/cKo6ldBa – Abhineet

+0

請提供可編譯代碼。 – Abhineet

回答

0

編輯:

按照你提供的鏈接,N的範圍是2 ≤ N ≤ 1000000
因此,正如@退休忍者建議的那樣,你可能會得到堆棧溢出。

解決方案:使用一個向量。

別的不說,這不是有效的C++:

cin>>n; 
cin>>q; 

int array[n],temp[n],temp2[n]; 

這裏的n應該是一個編譯時間常數。更好的方法是使用

std::vector<int> array(n); 

一個原因,爲什麼你得到運行時錯誤是你可能訪問界限數組了:

b=act[2]-'0'; 
if(act[0]=='S'){ 
    if(array[b]==0){ 

你怎麼知道這裏是b小於數組尺寸?

我建議你通過調試器運行它。

+0

但是,如何解決這個問題呢?如果代碼有運行時錯誤,則編譯它,這意味着VLA擴展可用。 – juanchopanza

+0

這些陣列最終有多大?很可能是堆棧溢出。 –

+0

@juanchopanza看到我的更新。 –

相關問題