Ошибка выравнивания матрицы собственной библиотеки при запуске кода на Raspberry Pi, но не в Linux - PullRequest
1 голос
/ 05 июня 2019

Я пишу код на c ++ для запуска на Raspberry Pi, используя библиотеку Eigen для работы с моими массивами и матрицами.Код, который я написал, работает в Linux, но когда я запускаю его на Raspberry Pi, он выдает эту ошибку:

Eigen::internal::matrix_array<T, Size, MatrixOptions, Align>::internal::matrix_array()
[with T = double, int Size = 2, int MatrixOptions = 2, bool Align = true]:
Assertion `(reinterpret_cast<size_t>(array) & (sizemask)) == 0 && "this assertion
is explained here: http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html
     READ THIS WEB PAGE !!! ****"' failed.

Я прочитал ссылку, данную мне в ошибке, и попытался переопределить различные определения в моемкод, следуя его инструкциям, но безрезультатно.Я выполняю большое количество матричных операций и не могу определить, где именно что-то идет не так.

Чтобы не усложнять ситуацию, я приведу определения моих классов, опуская все, кроме определений функций:

class TileBlock{
public:
    TileBlock();
    TileBlock(REGION_BD &region_bd, std::shared_ptr<Tile> linked_tile, int Hin);
    TileBlock(REGION_BD &REGION_BD, std::shared_ptr<Tile> linked_tile, int Hin,
                        std::string alfa_str,
                        std::string bta_str,
                        std::string w_lower_str,
                        std::string w_upper_str,
                        std::string x_str,
                        std::string w_str,
                        std::string w_sol_str,

                        std::string y_exit_str,
                        std::string z_exit_str,
                        std::string bta_smp_str,
                        std::string alfa_sol_str,
                        std::string alfa_smp_str,
                        std::string w_smp_str,
                        std::string x_smp_str);
    ~TileBlock();
public:
    void cbta();
    void cbra(int idx_r_from,REGION_BD &theRegion,double r_min,
                long int N_REGION_TOTAL, Eigen::RowVectorXi& region_target_2,
                Eigen::RowVectorXi& region_neighbors);
    static int find_sample(Eigen::RowVectorXd& ySmp, double y);

private:
    void cbta_s1(double w, double d,
            Eigen::RowVectorXd& xSmp,
            Eigen::Matrix<double,2,N_CBTA_W>& btaSmp,
            Eigen::Matrix<double,2,1>& returnMatrix);

    void cbta_s2(double w, double d,
            Eigen::RowVectorXd& xSmp,
            Eigen::Matrix<double,2,N_CBTA_W>& btaSmp,
            Eigen::Matrix<double,2,1>& returnMatrix);

    void interp_broken_seg(Eigen::RowVectorXd& x_data,
            Eigen::Matrix<double,2,Eigen::Dynamic>& y_data,
            Eigen::RowVectorXd& x_interp,
            Eigen::Matrix<double,2,Eigen::Dynamic>& y_interp);

    template <typename Derived1, typename Derived2>
    void remove_inf_values(Eigen::MatrixBase<Derived1>& v,
            Eigen::MatrixBase<Derived2>& returnMatrix);

    template <typename Derived_a, typename Derived_b>
    void find_zeros(Eigen::MatrixBase<Derived_a>& fSmp,
            Eigen::MatrixBase<Derived_b>& returnMatrix);

    double pi2pi(double x);

};
class Tile{
public:
    Tile(int H, Eigen::Matrix<int,Eigen::Dynamic,4> tile_vertices);
    Tile(std::string traversal_type_str,
         std::string traversal_faces_str,
         std::string cell_xform_str,
         std::string channel_data_str,
         std::string cell_edge_str,
         std::string cell_vertices_str,
         std::string connectivity_str);
    ~Tile();
public:

    Eigen::Matrix<int,Eigen::Dynamic,4> channel_data;
    Eigen::Matrix<double,4,Eigen::Dynamic> cell_vertices;
    Eigen::Matrix<int,Eigen::Dynamic,1> traversal_type;
    Eigen::Matrix<int,Eigen::Dynamic,2> cell_xform;
    Eigen::Matrix<int,Eigen::Dynamic,1> traversal_faces;
    Eigen::Matrix<double,Eigen::Dynamic,4> cell_edge;

    std::shared_ptr<TileBlock> tile_block;

    std::shared_ptr<Eigen::SparseMatrix<int,Eigen::RowMajor>> connectivity;

    void set_tile_data(int, Eigen::Matrix<int,Eigen::Dynamic,4>);

    void addTileBlock(REGION_BD &region_bd, std::shared_ptr<TileBlock> this_tile, int H);

    void setMatricesFromJSON(std::string traversal_type_str,
                             std::string traversal_faces_str,
                             std::string cell_xform_str,
                             std::string channel_data_str,
                             std::string cell_edge_str,
                             std::string cell_vertices_str);

    void setConnectivityFromJSON(std::string connectivity_str);

};

Теперь, следующий фрагмент кода, где я считаю, что я нахожусьсталкиваюсь с неприятностями.Он находится в определении функции setMatricesFromJSON:

    /******* cell_vertices_str *******/
    temp_char_double[cell_vertices_str.size() +1];
    strcpy(temp_char_double, cell_vertices_str.c_str());

    burner_array.clear();
    token_double = strtok (temp_char_double,"[");

    counter = 0;
    while (token_double != NULL)
    {   
        burner_array.push_back(token_double);
        token_double = strtok (NULL, "[");
        counter++;
    }

    ss.clear();
    ss << burner_array[0];

    ss >> test_str;
    n = std::count(test_str.begin(), test_str.end(), ',');
    cell_vertices = Matrix4Xd::Zero(counter,n);
    test_str.clear();
    ss.clear();


    for (size_t i = 0; i < counter; i++)
    {   
        std::vector<double> ind_num_array;
        char *token_double;
        token_double = strtok (burner_array[i],",]");
        int j = 0;
        std::stringstream ss;
        while (token_double != NULL)
        {
            ss.clear(); 
            ss << token_double;
            double temp_val;
            ss >> temp_val;
            ind_num_array.push_back(temp_val);
            token_double = strtok (NULL, ",]");
            j++;
        }

        for (size_t k = 0; k < j; k++)
        {
            this->cell_vertices(i,k) = ind_num_array[k];
        }
    }

Код работает на Linux без проблем.Однако, когда я пытаюсь запустить его на своем Raspberry Pi, я получаю вышеупомянутую ошибку.Я также довольно новичок в c ++, и здесь довольно много кода, который я не включил, поскольку его довольно много, и я хочу быть максимально точным в своем вопросе.Спасибо за любую помощь, которую вы можете оказать мне!Я уже давно пытаюсь решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...