【问题标题】:How to properly cast std::vector< std::vector<double> > to void* and reinterpret it back?如何正确地将 std::vector< std::vector<double>> 转换为 void* 并重新解释它?
【发布时间】:2020-07-25 13:11:08
【问题描述】:

我不是 c++ 专家,我在将 std::vector&lt; std::vector&lt;double&gt; &gt; my_data 转换为 void *f_data 并重新解释此转换时遇到问题。

基本上我需要转换my_data:

std::vector<double> point1(2);
point1[0] = 0.06; point1[1] = 2.07;
std::vector<double> point2(2);
point2[0] = 1.01; point2[1] = 0.02;
std::vector< std::vector<double> > my_data;
my_data.push_back(point1);
my_data.push_back(point2);

使其适合来自 c++ 中 NLopt 包的 opt.set_min_objective(vfunc vf, void *f_data) 函数。

基于this post,我正在尝试以下方法,但它不起作用:

auto *test = static_cast<void*>(my_data.data());
std::vector< std::vector<double> > *this_data = reinterpret_cast<std::vector< std::vector<double> >*>(test);

在调试时出现以下错误:

this_data=Cannot access memory at address 0x3faeb851eb851eb8

我也试过了,但也没用:

auto test = static_cast<void*>(my_data.data());
std::vector< std::vector<double> > *this_data = reinterpret_cast<std::vector< std::vector<double> >*>(test);

任何帮助都会很棒。谢谢!

【问题讨论】:

  • 你试过(void*) &amp;my_data吗?
  • 您可以将向量的 data() 重新解释为向量指针。它不是向量,它是指向内部数据的指针,减去所有控制数据。 reinterpret_cast 说'相信我,这是一个指向向量的指针',它信任你并打破了。你想做什么
  • @Aplet123 演员表是多余的
  • 您不是“C++ 专家”并且不太了解如何做到这一点,这是完全可以理解的。你应该很高兴得知真正的 C++ 专家也不会做任何此类事情,所以你是一个很好的伙伴。

标签: c++ nlopt


【解决方案1】:

设置代码为:

opt.set_min_objective(vf, &my_data);

然后在vf函数内部检索指向原始的指针:

static_cast< std::vector<std::vector<double>>* >(f_data)

您可能希望使用它来初始化引用:

auto& my_data = *static_cast< std::vector<std::vector<double>>* >(f_data);

数据类型的 using 声明可以提高可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2020-02-19
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多