Modular C
Dispatch Table
A table of function pointers can group related module operations.
operation table
Each table entry names one operation and the function that implements it.
selected behavior
Changing an index selects a different function through the same call shape.
Dispatch Table
dispatch_table.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
static int add_two(int value) {
return value + 2;
}
static int times_three(int value) {
return value * 3;
}
int main(void) {
int useTriple = 0;
int value = 5;
int (*ops[2])(int) = {add_two, times_three};
int result = ops[useTriple](value);
printf("result=%d\n", result);
return 0;
}
#include <stdio.h>
static int add_two(int value) {
return value + 2;
}
static int times_three(int value) {
return value * 3;
}
int main(void) {
int useTriple = 1;
int value = 5;
int (*ops[2])(int) = {add_two, times_three};
int result = ops[useTriple](value);
printf("result=%d\n", result);
return 0;
}
#include <stdio.h>
static int add_two(int value) {
return value + 2;
}
static int times_three(int value) {
return value * 3;
}
int main(void) {
int useTriple = 0;
int value = 7;
int (*ops[2])(int) = {add_two, times_three};
int result = ops[useTriple](value);
printf("result=%d\n", result);
return 0;
}
useTriple ← 0, value ← 5, ops ← ⟨addr A⟩
11int main(void) {12 int useTriple→ 0 = 0; //@useTriple=113 int value→ 5 = 5; //@value=714 int (*ops→ ⟨addr A⟩[2])(int) = {add_two1, times_three1};15 int result = ops[useTriple](value5);static int add_two(int value)
3static int add_two(int value5) {4 return value5 + 2;5}result ← 7
14 int (*ops[2])(int) = {add_two, times_three};15 int result→ 7 = ops[useTriple](value5);1617 printf("result=%d\n", result7);18 return 0;19}outputresult=7
useTriple ← 1, value ← 5, ops ← ⟨addr A⟩
11int main(void) {12 int useTriple→ 1 = 1;13 int value→ 5 = 5;14 int (*ops→ ⟨addr A⟩[2])(int) = {add_two1, times_three1};15 int result = ops[useTriple](value5);static int times_three(int value)
7static int times_three(int value5) {8 return value5 * 3;9}result ← 15
14 int (*ops[2])(int) = {add_two, times_three};15 int result→ 15 = ops[useTriple](value5);1617 printf("result=%d\n", result15);18 return 0;19}outputresult=15
useTriple ← 0, value ← 7, ops ← ⟨addr A⟩
11int main(void) {12 int useTriple→ 0 = 0;13 int value→ 7 = 7;14 int (*ops→ ⟨addr A⟩[2])(int) = {add_two1, times_three1};15 int result = ops[useTriple](value7);static int add_two(int value)
3static int add_two(int value7) {4 return value7 + 2;5}result ← 9
14 int (*ops[2])(int) = {add_two, times_three};15 int result→ 9 = ops[useTriple](value7);1617 printf("result=%d\n", result9);18 return 0;19}outputresult=9