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

example
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;
}
  1. 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);
  2. static int add_two(int value)

    3static int add_two(int value5) {4    return value5 + 2;5}
  3. 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
  1. 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);
  2. static int times_three(int value)

    7static int times_three(int value5) {8    return value5 * 3;9}
  3. 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
  1. 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);
  2. static int add_two(int value)

    3static int add_two(int value7) {4    return value7 + 2;5}
  3. 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