O ponto de partida para resolver esse problema é uma estrutura de dados. Os elementos da estrutura são nós (structs) contendo:
- como chamar uma das funções: um ponteiro de função, quaisquer argumentos, qualquer outra informação
- quando chamar uma função: o 'ciclo' como você coloca.
Você pode usar uma lista simples criada em tempo de compilação, mas a lista inteira precisará ser pesquisada pelo menos uma vez para cada ciclo, e isso pode não ser bom para o desempenho. Uma abordagem melhor é adicionar cada nó a uma estrutura de dados projetada para minimizar a pesquisa. Eu sugeriria uma lista para cada módulo de ciclo, então 8 listas para os dados fornecidos.
- No momento da inicialização, adicione cada nó de função à (s) lista (s) na (s) qual (is) ele deve ser chamado.
- Em cada ciclo, basta descer a (s) lista (s) aplicável (is), chamando cada função por vez.
Simples, testável, sustentável, extensível.