【问题标题】:Obtaining a function pointer from an iterator over a function deque通过函数双端队列从迭代器获取函数指针
【发布时间】:2010-11-15 23:23:46
【问题描述】:

我正在尝试构建一个简单的赤字循环调度程序,现在我正在尝试获取运行时间最少的函数。当我尝试将迭代器转换为指针时,我收到“总线错误”。下面是我的代码,ptof 只是一个 typedef 指针,指向我在我的双端队列中拥有的函数类型,并且 State 包含每个进程的信息。我究竟做错了什么?非常感谢您的帮助。

ptof leastTime(deque<ptof> fnc, map<ptof, State *> s){
double leastElapsed= 100000000;
ptof  f;

deque<ptof>::iterator it;
for (it=fnc.begin() ; it < fnc.end(); it++ ){
if(s[*it]->elapsed<leastElapsed){
     f = (ptof)(&(*it)); 
cout<< s[f]->name<<endl;
     }
  }
return f;
}

【问题讨论】:

  • ptof 只是指向函数的指针的 typedef 吗?如果我们能看到这一点会很有帮助(并且一个最小的工作示例将使事情更容易诊断)
  • 我对 c 风格的演员表也很怀疑——它可能隐藏了你不希望它隐藏的各种邪恶的东西。获取迭代器指向的地址也很奇怪。
  • 哇,您知道您实际上是在将这些参数复制到函数中吗? How to pass objects to functions in C++?
  • 你能发布确切的错误信息吗?
  • 请:(A) 正确缩进代码(这很难阅读),(B) 添加必要的声明,以便我们可以将其粘贴到我们的编辑器中并尝试编译它。

标签: c++ function pointers casting iterator


【解决方案1】:
f = (ptof)(&(*it)); 

这将获取函数指针的地址。试试

f = *it;

在任何情况下,都要避免 C 风格的强制转换。如果您尝试使用 static_cast,编译器会告诉您强制转换无效。

【讨论】:

    【解决方案2】:

    获取迭代器指向的地址也很奇怪,看起来你正在将一个指向函数指针的指针强制转换为函数指针,这不是你想要的我不认为。

    c 风格的演员表没有帮助,因为它可以进行任何类型的演员表,甚至是你不想要的演员表。

    对于 C++ 中的类似情况,使用虚函数定义接口可能会更简洁,以避免可能是函数指针的混乱。

    【讨论】:

      猜你喜欢
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2011-09-17
      • 1970-01-01
      • 2020-01-12
      • 2019-04-20
      相关资源
      最近更新 更多