Ciągłe bugi, nie potrafię znaleźć

0

Zaraz mnie normalnie jasna Anielka weźmie w te i z powrotem.

http://ideone.com/lHgzeZ

#include <iostream>
#include <string>
#include <cctype>
#include <vector>
using namespace std;
 
struct huge {vector<char>num; huge();};
huge::huge():num(102,0){}
 
inline huge hmax () {huge res;for(int i=0;i<102;++i) res.num[i]=9; return res;}
inline bool comp (huge a, huge b) {return (a.num==b.num);}
inline bool even (huge n) {return (n.num[101]%2==0);}
inline bool zero (huge n)
{for(int i=0;i<102;++i) if(n.num[i]!=0) return false; return true;}
 
inline string out(huge output);
 
inline bool grtr (huge a, huge b)
{
    for(int i=0;i<102;++i)
    {
        if(a.num[i]>b.num[i]) return true;
        if(a.num[i]<b.num[i]) return false;
    }
    return false;
}
 
inline huge decr(huge n)
{
    for(int i=101;i>=0;--i)
        if(n.num[i]>0) {--n.num[i]; return n;}
        else n.num[i]=9;
    return n;
}
 
inline huge incr(huge n)
{
    for(int i=101;i>=0;--i)
        if(n.num[i]<9) {++n.num[i]; return n;}
        else n.num[i]=0;
    return n;
}
 
inline huge div2(huge n)
{
    for(int i=101;i>=0;--i)
        if(n.num[i]%2==0) n.num[i]/=2;
        else
        {
            n.num[i]/=2; n.num[i+1]+=5;
            if(n.num[i+1]>=10) {n.num[i+1]-=10; n.num[i]+=1;}
        }
        return n;
}
 
inline huge addc (huge a, huge b)
{
    for(int i=101;i>=0;i--)
    {a.num[i]+=b.num[i]; if(a.num[i]>=10) {a.num[i]-=10; a.num[i-1]+=1;}}
    return a;
}
 
inline huge mult (huge a, huge b)
{
    huge res;
    for(int i=101;i>=0;--i) if(a.num[i]!=0)
    for(int j=101;j>=0;--j) if(b.num[j]!=0)
    {
        huge hlp;
        if(i+j-101<0) return (hmax());
        hlp.num[i+j-101]=(a.num[i]*b.num[j])%10;
        if((a.num[i]*b.num[j])/10!=0)
            if(i+j-102<0) return (hmax());
            else hlp.num[i+j-102]=(a.num[i]*b.num[j])/10;
        res=addc(res,hlp);
    }
    return res;
}
 
inline huge itoh(int n)
{huge res; for(int i=0;n>0;++i) {res.num[101-i]=n%10; n/=10;} return res;}
 
inline huge pow(huge k, huge n)
{
    if(zero(n)) return itoh(1);
    if(!even(n))
    {return mult(k,pow(k,decr(n)));}
    huge hlp=pow(k,div2(n)); return mult(hlp,hlp);
}
 
inline huge mean (huge a, huge b)
{huge res=addc(a,b); if(!even(res)) res=decr(res); res=div2(res); return res;}
 
inline huge stoh(string input)
{
    huge res;
    for(int i=input.size()-1;i>=0;--i)
        res.num[102-input.size()+i]=int(input[i]-'0');
    return res;
}
 
inline huge read(void)
{
    string res;
    while(!isdigit(cin.peek())) cin.ignore();
    char hlp=cin.get(); while(isdigit(hlp)) {res+=hlp; hlp=cin.get();}
    return stoh(res);
}
 
inline string out(huge output)
{
    int i=0; while(output.num[i]==0) ++i;
    string res; for(;i<102;++i) res+=char('0'+output.num[i]);
    return res;
}
 
huge wysz (huge n, huge p)
{
    huge a=itoh(1); huge b=incr(p);
    huge res=mean(a,b); cerr << out(a) << '\t' << out(res) << '\t' << out(b) << '\n';
    huge hlp; hlp=pow(res,n);
    while(!comp(hlp,p))
    {
        if(grtr(hlp,p)) b=res;
        else a=res;
        res=mean(a,b); cerr << out(a) << '\t' << out(res) << '\t' << out(b) << '\n';
        hlp=pow(res,n);
    }
    return res;
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    int n; while(cin >> n) cout << out(wysz(itoh(n),read())) << '\n';
    return 0;
}

Próbuję rozwiązać to zadanie: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=49 Idea jest taka, żeby wyszukiwać ten pierwiastek binarnie. (gdyby to się okazało zbyt wolne, zamierzałem pomyśleć o newtonie-raphsonie).

Nie pamiętam, ile spędziłem już godzin usuwając z tego kodu rozmaite bugi, wsadzone najczęściej przez zwykłą nieuwagę. Aż dotarłem do momentu, gdzie w samym środku obliczeń dla bliżej nie poznanej przyczyny program wyrzuca SIGABRT... patrz link do Ideone.

Za nic nie potrafię znaleźć, skąd kurka wodna pojawia się ten błąd. Testowałem każdą funkcję z osobna. W końcu postanowiłem spróbować wyłapać ten sygnał i wypisać za pomocą cerra, któa funkcja i dla jakich parametrów podniosła SIGABTR: http://ideone.com/riFOOa

Za szlag. SIGSEGV od razu.

Tutaj już autentycznie coś mnie trafiło. Mam dość. Nie wiem, jak dojść do tego, która funkcja podnosi sigabrt a już tym bardziej do tego, jak doszedłem do sigsegvu.

Czy mógłbym kogoś prosić o wskazanie błędu? Dzięki!

0
  1. Przepisz to do wersji dla ludzi a nie dla maszyny, to może ktoś się zajmie.
  2. Uruchom to pod debugerem jak normalny człowiek to zobaczysz gdzie leci wyjątek...

1 użytkowników online, w tym zalogowanych: 0, gości: 1