(merci Brunni pour l'explication plus claire que la mienne

)
"Initialization discards qualifiers from pointer target type"
C'est par exemple quand on assigne une chaîne constante (de type const char *) à un char*, et que ce warning est activé.
Pour corriger cela, soit tu déclares ton pointeur const char * (si tu ne veux pas modifier le contenu de la chaîne), soit tu fais
char *string1 = (char *)"ABCDE";
pour être sûr que ton code ne fasse pas de warning à cet endroit-là quand le warning est activé (parfois, tu n'as pas le choix d'activer ce warning ou pas).
Tu veux donc faire une vraie table de sauts... Je ferais ça avec
switch (val) {
case 0: retval = fonction0(...); break;
case 1: retval = fonction1(...); break;
case 2: retval = fonction2(...); break;
case 3: retval = fonction3(...); break;
default: jemeplainsparcequecanauraitpasduarriver(...); break;
}
(c'est parfois utile, mais en général, c'est une
mauvaise idée d'oublier les break

)
Si tu veux des tables de string ne générant pas de relocations, tu dois le faire à la main avec de l'ASM + de l'ASM inline avec opérandes C. De mémoire, TICT S1P6 (la version que j'ai optimisée, moins lisible) et Ice Hockey 68k sont deux programmes qui font ça.