2013-12-13 76 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看到我的更新。 –

相关问题