debugging my integer class

I have a problem my integer class works well enough incrementing an integer from 0 up to 19, but after that it goes from 19 to 110.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include "integer.h"
using namespace std;

integer x(0), y(0), z(0);

#define display(stream, var) stream << #var << " = "; var.cout(); stream << endl;
#define show(a, b, c) display(cout, x); display(cout, y); display(cout, z);

int main()
{
    const int increments = 30;
    display(cout, x);
    for (int i = 0; i < increments; ++i)
        {
            ++x;
            display(cout, x);
        }
    cout << "now "; display(cout, x);
    return 0;



x = 0
x = 1
x = 2
x = 3
x = 4
x = 5
x = 6
x = 7
x = 8
x = 9
x = 10
x = 11
x = 12
x = 13
x = 14
x = 15
x = 16
x = 17
x = 18
x = 19
x = 110
x = 111
x = 112
x = 113
x = 114
x = 115
x = 116
x = 117
x = 118
x = 119
x = 1110
now x = 1110



here is what I think the problem lies:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
inline bool integer::operator ++()
{
    if (POS)
        {
            bool r = number[memory-1].p1();
            if (r)
                return true;
            else
                {
                    VERY BIG i = memory - 2, sp = i - size;
                    for (; i > sp; --i)
                        {
                            number[i+1] = 0;
                            resize(size+1);
                            r = number[memory-size].p1();
                            if (r)
                                return true;
                        }
                }
            return false;
        }
    return false;
}


number is of couse a digit pointer.

digit.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#ifndef DIGIT_H
#define DIGIT_H
#define baseball

//const short digit_range = 16;
const short digit_range = 10;
const short last_digit = digit_range-1;
const short bits = 4;

#include <string>
#include <bitset>

using namespace std;


template <unsigned bit>
bool operator <(const std::bitset<bit> & l, const std::bitset<bit> & r)
{
    for (int i = bits - 1; i > 0; --i)
        {
            if (l[i] > r[i])
                return false;
            if (l[i] < r[i])
                return true;
        }
    if (l[0] < r[0])
        return true;
    else return false;
}

template <unsigned bit1, unsigned bit2>
bool operator < (const std::bitset<bit1> & l, const std::bitset<bit2> & r)
{
    return bit1 < bit2;
}

template <unsigned bit>
bool operator <=(const std::bitset<bit> & l, const std::bitset<bit> & r)
{
    for (int i = bits - 1; i > 0; --i)
        {
            if (l[i] < r[i])
                return true;
            if (l[i] > r[i])
                return false;
        }
    if (l[0] > r[0])
        return false;
    else return true;
}

template <unsigned bit>
bool operator >= (const std::bitset<bit> & l, const std::bitset<bit> & r)
{
    for (int i = bits - 1; i > 0; --i)
        {
            if (l[i] > r[i])
                return true;
            if (l[i] > r[i])
                return false;
        }
    if (l[0] < r[0])
        return false;
    else return true;
}

template <unsigned bit1, unsigned bit2>
bool operator >= (const std::bitset<bit1> & l, const std::bitset<bit2> & r)
{
    return bit1 >= bit2;
}

class digit
{
    public:bitset<bits> dig;private:
    public:char pv;private:
    public:short vv;private:
    public:
    digit()
        {
            for (int i = 0; i < 4; ++i)
                dig[i] = 0;
        }

    digit(string s)
        {
            bitset<bits> copy(s);
            dig = copy;
        }
    digit(const digit &d)
        {
            pv = d.pv;
            vv = d.vv;
            dig = d.dig;
        }

    digit(int n)
        {
            bitset<bits> temp(n);
            if (n >=digit_range)
                return;//cerr
            else
                dig = temp;
                switch(n)
                    {
                        case 0: pv = '0'; vv = 0;  break;
                        case 1: pv = '1'; vv = 1;  break;
                        case 2: pv = '2'; vv = 2;  break;
                        case 3: pv = '3'; vv = 3;  break;
                        case 4: pv = '4'; vv = 4;  break;
                        case 5: pv = '5'; vv = 5;  break;
                        case 6: pv = '6'; vv = 6;  break;
                        case 7: pv = '7'; vv = 7;  break;
                        case 8: pv = '8'; vv = 8;  break;
                        case 9: pv = '9'; vv = 9;  break;
                        case 10: pv = 'A'; vv = 10; break;
                        case 11: pv = 'B'; vv = 11; break;
                        case 12: pv = 'C'; vv = 12; break;
                        case 13: pv = 'D'; vv = 13; break;
                        case 14: pv = 'E'; vv = 14; break;
                        case 15: pv = 'F'; vv = 15; break;
                        default: break;
                    }
                vv = pv - 48;
        }
    ~digit()
    {}

    bool operator = (const int & rhs)
        {
            if (rhs >= digit_range || rhs < 0)
                return false;
            bitset<bits> temp(rhs);
            dig = temp;
            switch (rhs)
                {
                    case 0: pv = '0'; vv = 0;  break;
                    case 1: pv = '1'; vv = 1;  break;
                    case 2: pv = '2'; vv = 2;  break;
                    case 3: pv = '3'; vv = 3;  break;
                    case 4: pv = '4'; vv = 4;  break;
                    case 5: pv = '5'; vv = 5;  break;
                    case 6: pv = '6'; vv = 6;  break;
                    case 7: pv = '7'; vv = 7;  break;
                    case 8: pv = '8'; vv = 8;  break;
                    case 9: pv = '9'; vv = 9;  break;
                    case 10: pv = 'A'; vv = 10; break;
                    case 11: pv = 'B'; vv = 11; break;
                    case 12: pv = 'C'; vv = 12; break;
                    case 13: pv = 'D'; vv = 13; break;
                    case 14: pv = 'E'; vv = 14; break;
                    case 15: pv = 'F'; vv = 15; break;
                    default: break;
                }
            return true;
        }
    bool operator = (const  digit & rhs)
        {
            if (rhs.vv >= digit_range || rhs.vv < 0)
                return false;
            for (int i = 0; i < bits; ++i)
                dig[i] = rhs.dig[i];
            switch(rhs.vv)
                {
                    case 0: vv = 0; pv = '0'; break;
                    case 1: vv = 1; pv = '1'; break;
                    case 2: vv = 2; pv = '2'; break;
                    case 3: vv = 3; pv = '3'; break;
                    case 4: vv = 4; pv = '4'; break;
                    case 5: vv = 5; pv = '5'; break;
                    case 6: vv = 6; pv = '6'; break;
                    case 7: vv = 7; pv = '7'; break;
                    case 8: vv = 8; pv = '8'; break;
                    case 9: vv = 9; pv = '9'; break;
                    case 10: vv = 10; pv = 'A'; break;
                    case 11: vv = 11; pv = 'B'; break;
                    case 12: vv = 12; pv = 'C'; break;
                    case 13: vv = 13; pv = 'D'; break;
                    case 14: vv = 14; pv = 'E'; break;
                    case 15: vv = 15; pv = 'F'; break;
                    default: break;
                }
            return true;
        }
    bool printf()
        {
            std::printf("%c",pv);
        }
    short value(){return vv;}
    bool operator > (const int & rhs)
        {
            return dig > digit(rhs).dig;
        }
    bool operator < (const int & rhs)
        {
            return dig < digit(rhs).dig;
        }
    bool operator <= (const int & rhs)
        {
            return dig <= digit(rhs).dig;
        }
    bool operator >= (const int & rhs)
        {
            return dig >= digit(rhs).dig;
        }
    bool operator > (const digit & rhs)
        {
            return dig > rhs.dig;
        }
    bool operator < (const digit & rhs)
        {
            return dig < rhs.dig;
        }
    bool operator >= (const digit & rhs)
        {
            return dig >= rhs.dig;
        }
    bool operator <= (const digit & rhs)
        {
            return dig <= rhs.dig;
        }
    bool operator == (const digit & rhs)
        {
            for (int i = 0; i < 4; ++i)
                if (!(dig[i] == rhs.dig[i]))
                    return false;
            return true;
        }
    bool operator != (const digit & rhs)
        {
            return !(*this == rhs);
        }
    bool operator - (const digit & rhs)
        {
            int i = 3;
            for (; i >= 0; --i)
                {
                    if (dig[i] != 0)
                        {
                            dig[i] = 0;
                            for (int j = i+1; i < 4; ++j)
                                {
                                    dig[j] = 1;
                                }
                            return true;
                        }
                }
            return false;
        }
    bool operator ++()
    {
        return ++dig;

    }

    inline bool p1();
};

    inline bool digit::p1()
        {
            if (dig >= last_digit)
                {
                    return false;
                }
            for (int i = 0; i < bits; ++i)
                if (dig[i] == 0)
                    {
                        dig[i] = 1;
                        for (int j = i-1; j >= 0; --j)
                            dig[j] = 0;
                        if (!(++pv && ++vv))
                            throw baseball;
                        return true;
                        return ++pv && ++vv;
                    }
            return false;
        }
#endif
if you need more code, just ask.
edit: bump
Last edited on
bump
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
inline bool integer::operator ++(){
    if (POS){
        //Increment least significant digit.
        bool r = number[memory-1].p1();
        if (r) //Has the LS digit looped around?
            return true;
        else{
            //Yes.
            //Start from the back, skip the final element.
            VERY BIG i = memory - 2, sp = i - size;
            for (; i > sp; --i){
                //On the first iteration, zero the last element.
                number[i+1] = 0;
                //Resize the number.
                //Logic error: not all numbers that fit these conditions should
                //be resized. Examples:
                // 19 -> 20
                // 390 -> 400
                resize(size+1);
                //I belive this says "increment the most significant digit".
                //Logic error: the MS digit shouldn't have to be incremented
                //more than once for each number increment.
                r = number[memory-size].p1();
                //Logic error: this condition will never be false. The loop
                //never runs more than once.
                if (r)
                    return true;
            }
        }
        return false;
    }
    return false;
}


PS: Your code practices make me sick.
Last edited on
Thanks, but does anyone remember the threat from a while back, I think it may have been in the lounce, where they were doing a group project or something on an big num class? I think it would help me immensly for ideas, now that I' ve been workin on my own for a while anyways.

Thanks
closed account (D80DSL3A)
I think this is the one you are asking for: http://cplusplus.com/forum/lounge/32041/
Topic archived. No new replies allowed.