指向函数的指针数组的指针

Pointer to array of pointers to functions

本文关键字:指针 数组 函数      更新时间:2023-10-16

这个想法是根据它们在表中的索引调用不同的函数。但是第 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的递增是不正确的。

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;
}

应用@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;
}

因此,我们没有"难以声明"的C类型,而是像int一样简单的事情,一切都很好。

当你使用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;
}