指向函数指针数组的指针

时间:2018-04-20 13:23:10

标签: c++ casting function-pointers

这个想法是根据表中的索引调用不同的函数。 但第27行产生运行时错误(( 我试图修复但没有成功((( 这是简化的代码:

#include <iostream>

void f1 (void) {
  std::cout << "f1" << "\n";
}

void f2 (void) {
  std::cout << "f2" << "\n";
}

typedef void (*fPtr[3])(void); // simple "[]" instead of "[3]" gets the compile error

class modeChanger {
  public:
    modeChanger (fPtr funcArray);
    void op ();
  private:
    fPtr *_funcArray;
};

modeChanger::modeChanger (fPtr funcArray) {
  _funcArray = (fPtr *) funcArray;
}

void modeChanger::op () {
  (*_funcArray[0])();
  (*_funcArray[1])(); // Line 27: this line generates a runtime error! Just comment it to get all work
}

void (*modeFuncArray[])(void) = {f1, f2, f2};

modeChanger *mode = new modeChanger (modeFuncArray);

int main() {
    (*modeFuncArray[1])(); // Works fine

    mode->op(); // generates a runtime error
    return 0;
}

这很好用:

(*_funcArray[0])();

以及:

(*modeFuncArray[1])();

但这会产生运行时错误......

(*_funcArray[1])(); 

似乎由于某种原因,_funcArray的递增是不正确的。

3 个答案:

答案 0 :(得分:3)

fPtr *_funcArray;这是指向数组的指针,而不是指针数组。您在类型转换的帮助下抑制了警告。请参见下面的固定代码。

#include <iostream>

void f1 (void) {
  std::cout << "f1" << "\n";
}

void f2 (void) {
  std::cout << "f2" << "\n";
}

typedef void (*fPtr)(void);

class modeChanger {
  public:
    modeChanger (fPtr *funcArray);
    void op ();
  private:
    fPtr *_funcArray;
};

modeChanger::modeChanger (fPtr *funcArray) {
  _funcArray = funcArray;
}

void modeChanger::op () {
  (*_funcArray[0])();
  (*_funcArray[1])(); // Line 27: this line generates a runtime error! Just comment it to get all work
}

void (*modeFuncArray[])(void) = {f1, f2, f2};

modeChanger *mode = new modeChanger (modeFuncArray);

int main() {
    (*modeFuncArray[1])(); // Works fine

    mode->op(); // generates a runtime error
    return 0;
}

答案 1 :(得分:2)

应用@ Someprogrammerdude的建议:

#include <iostream>
#include <array>
#include <functional>

void f1 (void) {
  std::cout << "f1" << "\n";
}

void f2 (void) {
  std::cout << "f2" << "\n";
}

using fPtr = std::function<void()>;
using fPtrs = std::array<fPtr, 3>;

class modeChanger {
  public:
    modeChanger (fPtrs funcArray);
    void op ();
  private:
    fPtrs _funcArray;
};

modeChanger::modeChanger (fPtrs funcArray) : _funcArray(funcArray) { }

void modeChanger::op () {
  _funcArray[0]();
  _funcArray[1]();
}   

int main() {
    fPtrs modeFuncArray = {f1, f2, f2};
    modeChanger mode(modeFuncArray);
    modeFuncArray[1]();

    mode.op(); 
    return 0;
}

因此,而不是很难宣布&#34; C类型,我们有int这样简单的事情,一切都很好。

答案 2 :(得分:0)

当你使用c ++时,你应该使用c ++特性而不是C,你应该使用<functional>

#include <iostream>
#include <functional>
void f1(void) {
    std::cout << "f1" << "\n";
}

void f2(void) {
    std::cout << "f2" << "\n";
}

typedef void(*fPtr[3])(void); // simple "[]" gets the compile error

class modeChanger {
public:
    modeChanger(std::function<void(void)>* funcArray);
    void op();
private:
    std::function<void(void)> * _funcArray;
};

modeChanger::modeChanger(std::function<void(void)>* funcArray) {
    _funcArray = funcArray;
}

void modeChanger::op() {
    _funcArray[0]();
    _funcArray[1](); // this line generates a runtime error! Just comment it to get all work
}

std::function<void(void)>  modeFuncArray[]  = { f1, f2, f2 };

modeChanger *mode = new modeChanger(modeFuncArray);

int main() {
    modeFuncArray[1](); // Works fine

    mode->op(); // generates a runtime error
    return 0;
}