Здравствуйте! Мне требуется инициализировать в конструкторе структуру типа vector(map(int,double)) (с её помощью реализуется разрежённая матрица) на основании данных о вычислительной сетке из объекта mesh. Внутри конструктора всё происходит замечательно, то есть если в конце конструктора вывести на экран размер этого вектора и его содержимое, то там всё в порядке и он не пустой. Однако после возврата в основную программу размер вектора оказывается равным нулю, то есть он становится пустым. В чём может быть дело?
класс описан в файле operators.h
#include "mesh.h"
// stores the matrix of the operator in CSR format using vector of maps
class Operator {
public:
int N; // number of rows = number of columns = N
std::vector< std::map< int, double > > x; //sparse matrix Operator_x
Operator(Mesh &mesh); // constructor
};
его реализация в файле operators.cpp
#include "operators.h"
#include "mesh.h"
// constructs matrix for grad, div, rot operator
Operator::Operator(Mesh &mesh) {
int i,j;
// number of rows = number of nodes
N = mesh.n;
// allocate memory for matrix
std::vector< std::map< int, double > > x(N); //sparse matrix Operator_x
// fill the matrix with values
for ( i = 0 ; i < N ; i++ )
{
for ( j = 0 ; j < mesh.node[i].nb.size() ; j++ )
{
x[i][mesh.node[i].nb[j].num] = mesh.node[i].nb[j].norm_x / (2. * mesh.node[i].S);
}
}
// здесь всё хорошо, выводится ненулевой размер и правильные элементы
std::cout << "x.size=" << x.size() << "\n";
for (i = 0; i < N; i++)
for (auto it = x[i].begin(); it != x[i].end(); it++)
{
std::cout << "i=" << i << " j=" << it->first << " value=" << it->second << "\n";
}
};
И наконец вызов из main(), с которым проблема
Operator A12(mesh);
//вот здесь выводится нулевой размер
std::cout << "x.size=" << A12.x.size() << "\n";
Потому что надо не
Operator::Operator(Mesh &mesh) {
...
std::vector< std::map< int, double > > x(N);
а примерно так:
Operator::Operator(Mesh &mesh):x(N) {
...
// Это не нужно!! Это локальная переменная, а не член!
// std::vector< std::map< int, double > > x(N);
Виртуальный выделенный сервер (VDS) становится отличным выбором
есть отдельный поток класс который работает с Socket-омКогда я отключаю клиент он все равно продолжает работать
Здравствуйте, разрабатываю грубо говорю систему для автоматического проведения олимпиад и вот столкнулся с проблемой синхронизации, точне...