运行时错误:SIG SEGV

时间:2014-02-01 07:07:58

标签: c++

我在热门编码网站codechef上提交名为“Money Transformation”的问题时出现问题。每次提交解决方案时我都会收到运行时错误名称SIG SEGV。在google上搜索一些后我发现这是某种分段错误。我尝试了Codechef的常见问题解答中给出的所有可能的解决方案,但是无法正确解决这个错误。此错误必须是编译器特定的,我在我的机器上使用CodeBlock(12.1)及其minigw编译器和我的程序运行得很好..请帮助我理解问题并解决它.. 下面是我的程序(根据codechef的faq解决方案编辑后)

#include <iostream>

using namespace std;
int i=0;
class money
{
  public:
    int a[101],b[101];
    money()
    {
        for(int t=0;t<102;t++)
        {
            a[101]=0;
            b[101]=0;
        }
    }
};
money m;
void swp(int &a,int &b)
{
    int temp=0;
    temp=a;
    a=b;
    b=temp;
}
int maximum()
{
    int x=0;
    m.a[100]=m.a[0];
    m.b[100]=m.b[0];
    for(int j=1;j<=(i+1);j++)
    {
        if(m.a[j]>m.a[100])
       {
            m.a[100]=m.a[j];
            m.b[100]=m.b[j];
            x=j;
       }
        if(m.a[j]==m.a[100])
       {
            if(m.b[i]>m.b[100])
            {
                m.a[100]=m.a[j];
                m.b[100]=m.b[j];
                x=j;
            }

        }
    }
    return x;
}
void moneytransform(int a,int b,int c)
{
    m.a[0]=a;
    m.b[0]=b;
    while(true)
    {
         if(c>m.b[i]&&m.a[i]>0)
        {
            m.a[i+1]=m.a[i]-1;
            m.b[i+1]=m.b[i]+100-c;
        }
        else
        {
            m.a[i+1]=m.a[i];
            m.b[i+1]=m.b[i]-c;
        }
        swp(m.a[i+1],m.b[i+1]);
        if((m.b[i]<c&&m.a[i]==0)||(m.a[i+1]>100||m.b[i+1]>100))
        {
                return;
        }
        i++;
    }

}

int main()
{
    int T,A,B,C,M;
    do
    {
       cin>>T;
     }while(T>40);
     int noc=1;
     while(noc<=T)
    {
        do
    {
        cin>>A>>B>>C;
    }while(A<0&&B<0&&C<0&&A>100&&B>100&&C>100);
    moneytransform(A,B,C);
    M=maximum();
    cout<<M;
    noc++;
    }
    return 0;
 }

和codechef问题的链接是.. http://www.codechef.com/problems/MONTRANS/

1 个答案:

答案 0 :(得分:3)

在您的货币构造函数中,您有

money()
{
    for(int t=0;t<102;t++)
    {
        a[101]=0;
        b[101]=0;
    }
}

您访问[101],它超出了数组的范围。该数组的大小为101,因此有效索引为0-100。无论如何,你可能想做别的事情,没有必要一遍又一遍地把0写到同一个地方。

您的错误可能完全来自不同的地方,但这个错误很突出。就像axiom指出的那样,你应该在调试器中运行你的程序。