Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

c call c++ api segfault #230

Closed
wupeaking opened this issue Dec 20, 2021 · 1 comment
Closed

c call c++ api segfault #230

wupeaking opened this issue Dec 20, 2021 · 1 comment

Comments

@wupeaking
Copy link

I want to call fmm c++ api using c. but I meet an issue. it always says segfault.
The initial suspicion is that the smart pointer conversion error. but I don't know to fix it.

the c++ warp code:

#include <fmm/fmm-api.hpp>
#include <iostream>
#include "fmm_warp.h"
#include <fmm/mm/fmm/ubodt.hpp>
#include <fmm/mm/fmm/fmm_algorithm.hpp>
#include <fmm/python/pyfmm.hpp>

#ifdef __cplusplus
extern "C"{
#endif

using namespace FMM;
using namespace FMM::NETWORK;
using namespace FMM::CORE;
using namespace FMM::MM;

void *network_create(char* filename, char* id, char* source, char* target) {
    std::string file_str(filename);
    std::string id_str(id);
    std::string source_str(source);
    std::string target_str(target);
    return new NETWORK::Network(file_str, id_str, source_str, target_str); //构造
}

void network_delete(void* network){
    delete static_cast<NETWORK::Network *>(network);
}

int network_get_node_count(void* network) {
    return static_cast<NETWORK::Network *>(network)->get_node_count();
}

void* networkgraph_create(void* network) {
    // FMM::NETWORK::Network& p = static_cast<NETWORK::Network *>(network);
    return new NETWORK::NetworkGraph(*(static_cast<NETWORK::Network *>(network)));
}

void networkgraph_delete(void* graph) {
    delete static_cast<NETWORK::NetworkGraph *>(graph);
}

void* read_ubodt_csv(char* filename){
    std::string file_str(filename);
    std::shared_ptr<UBODT> u =  UBODT::read_ubodt_csv(file_str);
    //  UBODT &b = *u;
    // UBODT *b = &*u;
    // UBODT *b = u.get();
    return &*u;
}

void ubodt_delete(void* ubodt) {
    delete static_cast<UBODT *>(ubodt);
}

double ubodt_get_delta(void* ubodt){
    return static_cast<UBODT *>(ubodt)->get_delta();
}


void* FastMapMatch_create(void* network, void* graph, void* ubodt){
    std::shared_ptr<UBODT> ubodt_shared_ptr((UBODT* )ubodt);
    // ubodt_shared_ptr.reset((UBODT *)ubodt);
    std::cout << "FastMapMatch_create----" << std::endl;
    std::cout << ubodt_shared_ptr->get_delta() << std::endl;

    return new FastMapMatch(
        *(static_cast<NETWORK::Network *>(network)),
        *(static_cast<NETWORK::NetworkGraph *>(graph)),
        ubodt_shared_ptr
    );
}

void FastMapMatch_match_wkt(void* fmm, char* wkt, void* fmm_cfg) {
    std::cout<< "1 -----------------" << std::endl;
    std::string file_str(wkt);
    std::cout<< "2 -----------------" << std::endl;
    // PYTHON::PyMatchResult result = 
    static_cast<FastMapMatch *>(fmm)->match_wkt(
        file_str,
        *(static_cast<FastMapMatchConfig *>(fmm_cfg))
    );
    std::cout<< "3 -----------------" << std::endl;
    // SPDLOG_INFO("Matched path: {} ", result.cpath);
}

void* FastMapMatchConfig_create(int k_arg, double r_arg, double gps_error, double reverse_tolerance) {
    return new FastMapMatchConfig(k_arg, r_arg, gps_error, reverse_tolerance);
}

void FastMapMatchConfig_delete(void* fmm_cfg) {
    delete static_cast<FastMapMatchConfig *>(fmm_cfg);
}
#ifdef __cplusplus
}
#endif

the c test code:

#include "fmm_warp.h"
#include <stdio.h>

int main() {
    void* network = network_create("data/edges.shp", "id", "source", "target");
    printf("--------- %d\n", network_get_node_count(network));
    void* graph = networkgraph_create(network);
    void* ubdot = read_ubodt_csv("data/ubodt.txt");
    void* fmm = FastMapMatch_create(network, graph, ubdot);
    void* fmm_cfg = FastMapMatchConfig_create(4, 0.4, 0.5, 0);
    FastMapMatch_match_wkt(
		fmm,
		"LINESTRING(0.200812146892656 2.14088983050848,1.44262005649717 2.14879943502825,3.06408898305084 2.16066384180791,3.06408898305084 2.7103813559322,3.70872175141242 2.97930790960452,4.11606638418078 2.62337570621469)",
		fmm_cfg
	);
}
@wupeaking
Copy link
Author

I have solved this problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant