どのように関数へのポインタをつくりますか?
コンパイラはコンパイル時に完全なコールツリーを知る必要があるため、関数へのポインタを許可しません。コールツリーは完全なRAM再使用のためのメモリ割り当てに使用します。同時に実行されない関数では、関数は同じRAM領域を使用することがあります。
加えてPICにはデータスタックがありません。関数のパラメータは、どのような関数がコールされるのかをコンパイル時に調べて特別な方法で渡されます。
ポインタにより関数をコールすることは、コンパイル時にこれら両方のことを知ることを妨げます。ステートマシンを作成するためには関数のポインタが欲しくなりますが、以下はポインタを使わないで如何にこれをおこなうかの例です。:
enum tasks {taskA, taskB, taskC};
run_task(tasks task_to_run) {
switch(task_to_run) {
case taskA : taskA_main(); break;
case taskB : taskB_main(); break;
case taskC : taskC_main(); break;
}
}