Odai Athamneh
Odai Athamneh

Reputation: 29

Why is this vector of vectors out of scope?

I've written the code below to add/multiply a vector of vectors (a multidimensional array, essentially):

int matrix_numbers[] = { 1, 2 };

// get rows and columns from user (omitted)

for each (int matrix in matrix_numbers) {
  if (matrix == 1) {
      vector<vector<int>> first_matrix(rows, vector<int>(columns));
      request_matrix_data(first_matrix, rows, columns);
      output_matrix_data(first_matrix, rows, columns);
  }
  else { // matrix == 2
      vector<vector<int>> second_matrix(rows, vector<int>(columns));
      request_matrix_data(second_matrix, rows, columns);
      output_matrix_data(second_matrix, rows, columns);
  }
}

add_them(first_matrix, second_matrix);

I'm getting the following errors from Visual Studio for the add_them() function:

error C2065: 'first_matrix': undeclared identifier
error C2065: 'second_matrix': undeclared identifier

I can tell from the debugger that first_matrix and second_matrix are being dumped after the for each loop, but why is that?

Upvotes: 1

Views: 96

Answers (1)

Nathan Wride
Nathan Wride

Reputation: 965

Because you are declaring them within the if statement inside the for loop. This means you can only access them within that if statement. See this tutorial on variable scope

You can fix them by rewriting them to have a scope equal to the function.

Your iterator also looks wrong, you should rewrite this also.

const int matrix_size = 2;
int matrix_numbers[matrix_size] = { 1, 2 };

vector<vector<int>> first_matrix;
vector<vector<int>> second_matrix;

// get rows and columns from user (omitted)

for (int n = 0; n < matrix_size; n ++) {
  int matrix = matrix_numbers[n];

  if (matrix == 1) {
      first_matrix = vector<vector<int>>(rows, vector<int>(columns));
      request_matrix_data(first_matrix, rows, columns);
      output_matrix_data(first_matrix, rows, columns);
  }
  else { // matrix == 2
      second_matrix = vector<vector<int>>(rows, vector<int>(columns));
      request_matrix_data(second_matrix, rows, columns);
      output_matrix_data(second_matrix, rows, columns);
  }
}

add_them(first_matrix, second_matrix);

Upvotes: 3

Related Questions