arduino语言与c语言,认识Arduino与C语言的指针和指针数组 – Arduino 实验室

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

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

建立函式指针程序

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

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

110552708_1_2017091003202092.png

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

函式指针的语法

函式指针的语法如下:

110552708_2_20170910032020545.png

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

110552708_3_20170910032020592.png

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15#include

// 宣告自订函式

void hello() {

printf("hello world.\n");

}

// 宣告指向hello函式的函式指标

void (*f)() = hello;

void main(void) {

// 透过函式指标执行hello函式

(*f)();

}

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

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

110552708_4_20170910032020655.png

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

110552708_5_20170910032020717.png

完整的Arduino示例程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22// 宣告自订函式

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语言程序的示例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14#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: %d\n", val);

}

函式指针数组

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

110552708_6_20170910032020795.png

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35// 宣告三个自订函式

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程序语言的版本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29#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");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值