いろいろなテクニック.Nucleo と DISCO-F746 用.
Dependencies: Array_Matrix mbed
FunctionPointer.hpp@0:bb939e0bc6e2, 2017-10-15 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Oct 15 11:41:48 2017 +0000
- Revision:
- 0:bb939e0bc6e2
- Child:
- 1:bbb9f0c3e523
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:bb939e0bc6e2 | 1 | // 関数ポインタの使用例 |
MikamiUitOpen | 0:bb939e0bc6e2 | 2 | #include <cmath> |
MikamiUitOpen | 0:bb939e0bc6e2 | 3 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 4 | void (*fp1)(int); |
MikamiUitOpen | 0:bb939e0bc6e2 | 5 | void (*fp2)(int&); |
MikamiUitOpen | 0:bb939e0bc6e2 | 6 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 7 | // typedef を使って一種の型名として扱う例 |
MikamiUitOpen | 0:bb939e0bc6e2 | 8 | typedef float (*FP3)(float); |
MikamiUitOpen | 0:bb939e0bc6e2 | 9 | FP3 fp3Sin = sinf; |
MikamiUitOpen | 0:bb939e0bc6e2 | 10 | FP3 fp3Cos = cosf; |
MikamiUitOpen | 0:bb939e0bc6e2 | 11 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 12 | void printA(int x) { printf("printA: x = %d\r\n", x); } |
MikamiUitOpen | 0:bb939e0bc6e2 | 13 | void printB(int x) { printf("printB: x = %d\r\n", 2*x); } |
MikamiUitOpen | 0:bb939e0bc6e2 | 14 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 15 | void getA(int& a) { a = 2; } |
MikamiUitOpen | 0:bb939e0bc6e2 | 16 | void getB(int& a) { a = 5; } |
MikamiUitOpen | 0:bb939e0bc6e2 | 17 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 18 | // 関数ポインタの配列 |
MikamiUitOpen | 0:bb939e0bc6e2 | 19 | void (*fp4[])(int) = { printA, printB }; |
MikamiUitOpen | 0:bb939e0bc6e2 | 20 | // 関数ポインタの配列(typedef を使う場合) |
MikamiUitOpen | 0:bb939e0bc6e2 | 21 | typedef void (*FP5)(int); |
MikamiUitOpen | 0:bb939e0bc6e2 | 22 | FP5 myFp[] = { printA, printB }; |
MikamiUitOpen | 0:bb939e0bc6e2 | 23 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 24 | void SwPointer(int k) |
MikamiUitOpen | 0:bb939e0bc6e2 | 25 | { |
MikamiUitOpen | 0:bb939e0bc6e2 | 26 | printf("k = %d\r\n", k); |
MikamiUitOpen | 0:bb939e0bc6e2 | 27 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 28 | if (k==0) fp1 = printA; |
MikamiUitOpen | 0:bb939e0bc6e2 | 29 | else fp1 = printB; |
MikamiUitOpen | 0:bb939e0bc6e2 | 30 | fp1(100); |
MikamiUitOpen | 0:bb939e0bc6e2 | 31 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 32 | if (k==0) fp2 = getA; |
MikamiUitOpen | 0:bb939e0bc6e2 | 33 | else fp2 = getB; |
MikamiUitOpen | 0:bb939e0bc6e2 | 34 | int x; |
MikamiUitOpen | 0:bb939e0bc6e2 | 35 | fp2(x); |
MikamiUitOpen | 0:bb939e0bc6e2 | 36 | printf("nx = %d\r\n", x); |
MikamiUitOpen | 0:bb939e0bc6e2 | 37 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 38 | fp4[k](100); |
MikamiUitOpen | 0:bb939e0bc6e2 | 39 | myFp[k](10); |
MikamiUitOpen | 0:bb939e0bc6e2 | 40 | } |
MikamiUitOpen | 0:bb939e0bc6e2 | 41 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 42 | void MyFunctionPointer() |
MikamiUitOpen | 0:bb939e0bc6e2 | 43 | { |
MikamiUitOpen | 0:bb939e0bc6e2 | 44 | SwPointer(0); |
MikamiUitOpen | 0:bb939e0bc6e2 | 45 | SwPointer(1); |
MikamiUitOpen | 0:bb939e0bc6e2 | 46 | |
MikamiUitOpen | 0:bb939e0bc6e2 | 47 | printf("\r\n"); |
MikamiUitOpen | 0:bb939e0bc6e2 | 48 | printf("sin: %f\r\n", fp3Sin(3.1415926536f/3.0f)); |
MikamiUitOpen | 0:bb939e0bc6e2 | 49 | printf("cos: %f\r\n", fp3Cos(3.1415926536f/3.0f)); |
MikamiUitOpen | 0:bb939e0bc6e2 | 50 | } |