读者询问如何在Arduino中建立数个自定义函式,并且透过「函式指针数组数组指针,在不使用if…else或switch…case等条件判断式的情况下,让程序依据变数的值,执行不同的自定义函式。

下文将先介绍Arduino与C程序语言的函式指针语法

建立函式指针程序

就像变数一样,函式(function)同样被暂存在某个內存内存块,可以透过指针(pointer)取用;指向函式的指针称为「函式指针(function pointer)」

底下的Arduino程序宣告了一个hello()自定义函式,并透过一个叫做‘f’的指针指向并执行它:

指针数组用法_指针数组怎么输出_数组指针

若在Arduino执行此程序,将能在序列端口监控视窗看见“hello world.”信息。

函式指针的语法

函式指针的语法如下:

指针名称必须用代表「优先处理」的小括号包围,如果少了小括号数组指针,程序叙述的意义将大不相同:

数组指针_指针数组怎么输出_指针数组用法

上面的Arduino代码,若用C语言改写,将变成:

#include 
// 宣告自訂函式
void hello() {
printf("hello world.n");
}
// 宣告指向hello函式的函式指標
void (*f)() = hello;
void main(void) {
// 透過函式指標執行hello函式
(*f)();
}

函式指针的参数传递与传回值

假如要透过指针参照具有输入参数和传回值的函式,例如,一个计算并传回两整数相加值的自定义函式“sum”:

函式指针的定义也要跟着修改:

完整的Arduino示例程序如下:

// 宣告自訂函式
int sum(int x, int y) {
return x + y;
}
// 宣告具有兩個參數以及整數傳回值的函式指標
int (*f)(int x, int y) = sum;
void setup() {
Serial.begin(9600);
// 執行函式指標並傳遞兩個參數
int val = (*f)(8, 4);
// 將在序列埠監控視窗顯示"Ans: 12"
Serial.print("Ans: ");
Serial.println(val);
}
void loop() {
// 這裡沒有程式
}

相同功能的C语言程序的示例如下:

#include 
int sum(int x, int y) {
return x + y;
}
int (*f)(int x, int y) = sum;
void main(void) {
int val = (*f)(8, 4);
printf("Ans: %dn", val);
}

函式指针数组

认识函式指针的语法之后,函式指针数组的语法也很容易理解。假设程序事先宣告了名叫fn0,fn1和fn3的函式,底下的叙述将透过自定义的“f”指针数组指向它们:

底下是Arduino版本的函式指针数组示例,上传代码之后,开启序列端口监控视窗,接着在序列端口监控视窗中输入0~2的数字,程序将执行对应的fn0~fn2函式。

// 宣告三個自訂函式
void fn0() {
Serial.println("Hello from fn0.");
}
void fn1() {
Serial.println("Hello from fn1.");
}
void fn2() {
Serial.println("Hello from fn2.");
}
// 建立函式陣列指標
void (*f[3]) () = {fn0,fn1,fn2};
void setup() {
Serial.begin(9600);
Serial.println("Please input number 0~2:");
}
void loop() {
if( Serial.available() ) {
// 讀取序列輸入值,並轉換成整數。
   byte val = Serial.read() - 48;
   // 確認輸入值介於0和2之間
   if (val >= 0 && val < = 2) {
    // 將val當作陣列索引,執行對應的函式。
(*f[val])();
   } else {
    // 若輸入值超過指定範圍,則顯示“Wrong number!”(錯誤數字!)
Serial.println("Wrong number!");
}
}
}

底下是C程序语言的版本:

#include 
void fn0() {
printf("Hello from fn0.n");
}
void fn1() {
printf("Hello from fn1.n");
}
void fn2() {
printf("Hello from fn2.n");
}
void (*f[3]) () = {fn0,fn1,fn2};
void main(void) {
int val;
printf("nPlease input number 0~2:");
// 讀取輸入值
scanf("%d",&val);
if(val>=0 && val< =2) {
(*f[val])();
} else {
printf("Wrong number!n");
}
}

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410