943,718 Members | Top Members by Rank

Ad:
  • C++ Discussion Thread
  • Marked Solved
  • Views: 4450
  • C++ RSS
Mar 1st, 2007
0

Vector of vectors & magic square issues

Expand Post »
Hello folks

I'm trying to simulate a magic square algorithm, but having some problems. The program successfully creates the magic square, but when I'm trying to print it, the VC2005 compiler says "vector subscript out of range", which it shouldnt be.
Any help would be appreciated.
Cheers

Here's the code:

class Magicsquare{

public:
Magicsquare(int n);
void display(void);

private:
vector<vector<int> > square; //storing #s here

int totalsize; //stuff for generating the square
int nsqr;
int i,j;
};

MagicSquare::MagicSquare(int n)
{
totalsize=n;

vector<int> v(n);
vector<vector<int> > square(n,v);

nsqr = n * n; //this part runs ok
i=0;
j=n/2;

for (int k=1; k<=nsqr; ++k)
{
data[i][j] = k;

i--;
j++;

if (k%n == 0)
{
i += 2;
--j;
}
else
{
if (j==n)
j -= n;
else if (i<0)
i += n;
}
}
}

void Magicsquare::display(void) //this one doesn't
{
for (int i=0; i<sz; i++)
{
for (int j=0; j<sz; j++)
cout << data[i][j] << endl;
cout<<endl;
}
}
Last edited by rQQt2; Mar 1st, 2007 at 4:09 pm.
Similar Threads
Reputation Points: 10
Solved Threads: 0
Newbie Poster
rQQt2 is offline Offline
3 posts
since Mar 2007
Mar 1st, 2007
0

Re: Vector of vectors & magic square issues

Where is the variable sz defined and given avalue, and what value does it have in relation to dimensions of the the variable called data?

Also, please indent code so it is easier to read.
Reputation Points: 718
Solved Threads: 373
Nearly a Posting Maven
Lerner is offline Offline
2,253 posts
since Jul 2005
Mar 1st, 2007
0

Re: Vector of vectors & magic square issues

Here's my try for the properly indented code with the display function properly pasted. Sorry for the inconveniences, but pasting it from VC doesn't preserve whitespace, whis is very annoying!



#include"stdafx.h"
#include<iostream>
#include<vector>
usingnamespace std;




class MagicSquare{

private:
vector<vector<int> > data;

int sz; // !! sz is the size of the magic square, therefore the demensions of
// the data 'matrix'
int nsqr;
int i,j;

public:
MagicSquare(int n);
void displaySquare(void);
};

int main()
{
MagicSquare test(7);
test.displaySquare();

return 0;
}


MagicSquare::MagicSquare(int n)
{
sz=n;
vector<int> v(n);
vector<vector<int> > data(n,v);


nsqr = n * n;
i=0;
j=n/2;
for (int k=1; k<=nsqr; ++k)
{
data[i][j] = k;
i--;
j++;
if (k%n == 0)
{
i += 2;
--j;
}
else
{
if (j==n)
j -= n;
else if (i<0)
i += n;
}
}
}




void MagicSquare::displaySquare(void)
{
cout<<"\n\n\n\n####in printing function\n\n";
for (int i=0; i<sz; i++)
{
for (int j=0; j<sz; j++)
cout << data[i][j] << endl;
cout<<endl;
}

}
Last edited by rQQt2; Mar 1st, 2007 at 6:22 pm.
Reputation Points: 10
Solved Threads: 0
Newbie Poster
rQQt2 is offline Offline
3 posts
since Mar 2007
Mar 2nd, 2007
0

Re: Vector of vectors & magic square issues

Two problems I can see:

• Your memory allocation is not proper. Each of your rows share a common vector variable because of the stmt:
C++ Syntax (Toggle Plain Text)
  1. vector<int> v(n);
  2. vector<vector<int> > data(n,v);
Here the memory for each inner row is getting allocated only once and your two dimensional matrix gets populated with the same vector.

You need to change it to:
C++ Syntax (Toggle Plain Text)
  1. vector<vector<int> > data(n,vector<int> (n));
So that the memory allocation occurs for each row rather than only once for all rows.

• Your logic is skewed. The line :
C++ Syntax (Toggle Plain Text)
  1. i=0;
  2. j=n/2;
  3. for (int k=1; k<=nsqr; ++k)
  4. {
  5. data[i][j] = k;
  6. i--;
is bound to produce an out of bounds error since you are decemeneting i which already is zero, resulting in its value becoming -1, which is not a valid index.

Better use size_t instead of int for index variables to make sure you don't invade the out of bounds exception land. (assigning -ve values to such variables leads to a warning which is fairly easy to decode).
Super Moderator
Featured Poster
Reputation Points: 3233
Solved Threads: 719
Failure as a human
~s.o.s~ is offline Offline
8,871 posts
since Jun 2006
Mar 2nd, 2007
0

Re: Vector of vectors & magic square issues

Click to Expand / Collapse  Quote originally posted by ~s.o.s~ ...
Two problems I can see:

• Your memory allocation is not proper. Each of your rows share a common vector variable because of the stmt:
C++ Syntax (Toggle Plain Text)
  1. vector<int> v(n);
  2. vector<vector<int> > data(n,v);
Here the memory for each inner row is getting allocated only once and your two dimensional matrix gets populated with the same vector.

You need to change it to:
C++ Syntax (Toggle Plain Text)
  1. vector<vector<int> > data(n,vector<int> (n));
So that the memory allocation occurs for each row rather than only once for all rows.

• Your logic is skewed. The line :
C++ Syntax (Toggle Plain Text)
  1. i=0;
  2. j=n/2;
  3. for (int k=1; k<=nsqr; ++k)
  4. {
  5. data[i][j] = k;
  6. i--;
is bound to produce an out of bounds error since you are decemeneting i which already is zero, resulting in its value becoming -1, which is not a valid index.

Better use size_t instead of int for index variables to make sure you don't invade the out of bounds exception land. (assigning -ve values to such variables leads to a warning which is fairly easy to decode).

Ok, thanks a lot man. I've finally fixed my code, and the proram works fine now. Thanks for all the help
Cheers!
Reputation Points: 10
Solved Threads: 0
Newbie Poster
rQQt2 is offline Offline
3 posts
since Mar 2007

This thread is solved

Either the thread starter or a moderator has marked this thread as solved. You can most likely trust the responses and answers given. There is most likely no reason for any further responses to be posted here. If you have a related question, please start a new thread in this forum instead.

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in C++ Forum Timeline: trying to make a "Do While" loop; loop
Next Thread in C++ Forum Timeline: Types of methods in C++?





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC