# Writing a wrapper around rational?

Susan Margulies smargulies at ucdavis.edu
Tue Dec 12 04:10:30 CET 2006

```Hello, everyone! I wrote a little wrapper to go around a mpq_t so that
I could do inline additions and multiplications, etc. This wrapper
works 99.9% of the time, but every once in awhile, there is a seg
fault:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000428c67 in __gmpq_set ()
(gdb)

==============

(gdb) bt
#0  0x0000000000428c67 in __gmpq_set ()
#1  0x0000000000423ef9 in rational::operator= ()
#2  0x0000000000419a1b in GraphLinearSystem::reduce_rows ()...
#3  0x000000000041b9c5 in GraphLinearSystem::gaussian_elimination ()
#4  0x000000000041bcc3 in GraphLinearSystem::isConsistent ()
#5  0x00000000004124b7 in Graph::isKColorable ()
#6  0x000000000040404d in probability_test ()
#7  0x0000000000404b6d in probability_test_flower ()
#8  0x00000000004066aa in main ()
(gdb)

In reduce_rows, I have a map and an iterator:

map<unsigned long int, rational> rr_map = vArow[rr_info.row];
map<unsigned long int, rational>::iterator rr_iter = rr_map.begin();

Here is the precise line that causes the crash, in reduce rows

if (rr_iter == rr_map.end()) {
rr_q = (*rr_iter).second;

In my rational wrapper, I have a single member variable:
mpq_t gmp_rational;

/* default constructor */
rational::rational() {
mpq_init(gmp_rational);
}

rational& rational::operator=(const rational& q)
{
mpq_set(gmp_rational, q.gmp_rational);
return *this;
}

The function that is seg faulting __gmpq_set () is called within the
equality operator at mpq_set(gmp_rational, q.gmp_rational).

This code works fine 99% of the time, but there does seem to be some
strange problem. Can anyone see anything or maybe suggest some
changes?

Thank you *very* much for your time!

Best,
Susan

```