У меня возникла проблема с отправкой проблемы с названием "Денежная трансформация" на популярном кодеке сайта codechef. Я получаю имя ошибки во время выполнения SIG SEGV
каждый раз, когда я отправляю решение. SIG SEGV
некоторого поиска в google я обнаружил, что это какая-то сегментация fault..I пробовал все возможные решения, заданные в Codechef FAQ, но не мог получить его правильно. Также эта ошибка должна быть специфичной для компилятора. Я использую CodeBlock (12.1) на своей машине с ее мини-компилятором, и моя программа работает отлично..Пожалуйста, помогите мне разобраться в проблеме и решить ее. Ниже моя программа (после того, как я отредактировал ее в соответствии с решением кодека 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;
}
и ссылка на проблему с кодеком - это http://www.codechef.com/problems/MONTRANS/
В вашем денежном конструкторе у вас есть
money()
{
for(int t=0;t<102;t++)
{
a[101]=0;
b[101]=0;
}
}
Вы получаете доступ к [101], который находится за пределами границ массива. Массив имеет размер 101, поэтому действительные индексы равны 0-100. Независимо от того, вы, вероятно, хотели сделать что-то еще, нет необходимости писать 0 в одно и то же место снова и снова.
Ваша ошибка может исходить из другого места целиком, но эта ошибка выделяется. Как указано в аксиоме, вы должны запустить свою программу в отладчике.