SIGABRT --


HI,
in this part of code, I'm trying to read a matrix provided by a question found on the internet, before transforming into a string, fragmenting into smaller elements, and then assign each element of the matrix.

I took information and surely i have a memory leak in the function "convert" or in the previous one "select". I guess I should give a pointer to the string, to something other than NULL.


libc++abi.dylib: terminate called throwing an exception
1199Printing description of assign_mx_a:
(std::__1::istringstream) assign_mx_a = {
  std::__1::basic_istream<char, std::__1::char_traits<char> > = {
    std::__1::basic_ios<char, std::__1::char_traits<char> > = {
      std::__1::ios_base = {
        __fmtflags_ = 1606635760
        __precision_ = 4294991144
        __width_ = 140734800055376
        __rdstate_ = 16392
        __exceptions_ = 1
        __rdbuf_ = 0x0000000000000000
        __loc_ = 0x0000000000000000
        __fn_ = 0x00000000000000f7
        __index_ = 0x0000000000000000
        __event_size_ = 140734799802416
        __event_cap_ = 140734799822871
        __iarray_ = 0x0000000000000000
        __iarray_size_ = 0
        __iarray_cap_ = 140734799802624
        __parray_ = 0x00007fff8e0608ee
        __parray_size_ = 140734799802928
        __parray_cap_ = 140734799802968
      }
      __tie_ = 0x0000000000000000
      __fill_ = 2
    }
    __gc_ = 4294990403  // i think here the problem(__gc_	std::__1::streamsize	4294990403
  }
  __sb_ = {
    std::__1::basic_streambuf<char, std::__1::char_traits<char> > = {
      __loc_ = {
        __locale_ = 0x00007fff5fc350f0
      }
      __binp_ = 0x0000000100005d28
      __ninp_ = 0x00007fff5fc3cc50
      __einp_ = 0x0000000100004008
      __bout_ = 0x0000000000000000
      __nout_ = 0x0000000000000000
      __eout_ = 0x00000000000000f7
    }
    __str_ = ""
    __hm_ = 0x0000000000000000
    __mode_ = 0
  }
}
(lldb) 


I tried to become the variable mx string from local to global, but does not work.

any help is appreciated.
thanks in advance




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
#include <iostream>
#include <sstream>
#include <string>

using namespace std;


class bestProduct
{
private:
	string m =
	{
		"08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57	86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36	20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"
	};
	
	int i;
	int j;	
	int Best_Max_Product ;
	
public:
	size_t klimit;                                       // 
	int a[ 20 ][ 20 ];                                   // the matrix
	
	explicit bestProduct()                               // constructor
	{
		klimit = m.length();
		Best_Max_Product = 0;
		
		for ( i = 0; i < 20; i++ )
		{
			for (j = 0; j < 20; j++ )
			{
				a[ i ][ j ] = 0;
			}
		}
	}
	
	string select( int k )                               // extract item of the string
	{
		cout << ( klimit = m.at(0) );
		string mx = m.substr( k,2 );
		return mx;
	}
	
	int convert( string mx )                             // convert item of the string on item for matrix
	{
		int mx_a;
		istringstream assign_mx_a( mx.substr( i,2 ) ); // <<---HERE THE PROBLEM
		assign_mx_a >> mx_a;
		return mx_a;
	}
	
	void setvalue( int value )                           // assign item to matrix
	{
		a[ i ][ j ] = value;
	}
	
// other.....	
};

int main()
{
	class bestProduct p;
	int i, j, k;
	
	for ( i = 0; i < 20; i++)
	{
		for ( j = 0; j < 20; j++)
		{
			for ( k = 0; k < p.klimit; k += 4 )
			{
				p.setvalue( p.convert( p.select( k ) ) );
			}
		}
	}

	    return 0;
}


no help?
Sometimes it takes a while for people to figure out your problem... This isn't a very fast forum so be patient. I'm looking at it now.
The problem here is in the concept of scope:
You have i as a member of BestProduct. You use it in the constructor's for loops. When you're done with it, you've left i at 20.

Now the first time that you have used int convert( string mx ); i is still junk from the constructor. It's 20.

So on your first pass, you call string select (0) which returns a string with a size of 2. That gets passed into int convert(string mx). Then when we call mx.substr(i,2) we are calling mx_substr(20,2) which is impossible.

Solutions: use a local int i in the constructor (it's safer). Also, what did you expect i to be in convert? In select you've already extracted a 2-digit string and so I don't think you need to even use substr again.

Try replacing line 48 with this:
istringstream assign_mx_a( mx );


In general, try and keep for loop counters local. I like to define them in the for loop itself so that the same letters can be defined elsewhere in the same function with guaranteed integrity. Also, recognize which scope your variables are in. You were treating i,j as if they were global in scope, but they were actually members of bestProduct and locals of main. One good way of keeping track of this is to use m_ as a prefix for all member variables. Another idea is that when in doubt you can prepend the scope to an operator. this->i will ensure that you are using a member variable while ::i would ensure that you are using a global variable. There is no way for you to access local variables from other functions without making them parameters.
Last edited on
By the way, I see a similar problem in void setvalue (int value).

You are using i and j. Members i and j are both 20 as written by the constructor. You never change those. In int main() you define local i,j,k, but those are only locals, you can't expect them to influence the internal members of the bestProduct.

For setvalue, I recommend passing i and j as parameters into the function. Don't rely on global memory and expect it to do what you want. Here's your code with the suggested changes:

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
#include <iostream>
#include <sstream>
#include <string>

using namespace std;


class bestProduct
{
private:
    string m =
    {
        "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57    86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36    20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"
    };

    int i;
    int j;
    int Best_Max_Product ;

public:
    size_t klimit;                                       //
    int a[ 20 ][ 20 ];                                   // the matrix

    explicit bestProduct()                               // constructor
    {
        klimit = m.length();
        Best_Max_Product = 0;

        for ( int i = 0; i < 20; i++ )
        {
            for ( int j = 0; j < 20; j++ )
            {
                a[ i ][ j ] = 0;
            }
        }
        Best_Max_Product = 0;
    }

    string select( int k )                               // extract item of the string
    {
        cout << ( klimit = m.at(0) );
        string mx = m.substr( k,2 );
        return mx;
    }

    int convert( string mx )                             // convert item of the string on item for matrix
    {
        int mx_a;
        istringstream assign_mx_a( mx ); 
        assign_mx_a >> mx_a;
        return mx_a;
    }

    void setvalue( int i, int j, int value)              // assign item to matrix
    {
        a[ i ][ j ] = value;
    }

// other.....
};

int main()
{
    class bestProduct p;
    int i, j, k;

    for ( i = 0; i < 20; i++)
    {
        for ( j = 0; j < 20; j++)
        {
            for ( k = 0; k < p.klimit; k += 4 )
            {
                p.setvalue( p.convert( p.select( i, j, k ) ) );
            }
        }
    }

    return 0;
}

Last edited on
Thx. I try to change and after answer to you
I thank you very much stewebond. you've been really clear and exhaustive. I will treasure your explanation.
Thanks again and excuse my inexperience.
Last edited on
Treasure away. Glad to be of help.
Topic archived. No new replies allowed.