Encoder des caractères à l'aide d'une table

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Dans le cadre d’un projet, on cherche à transmettre des données encodées arbitrairement.
Par exemple, voici la table d’encodage des premières lettres de l’alphabet :

Lettre Lettre encodée
a 4A63
b F8C1
c 70AE
d 752F

On souhaite représenter cette table d’encodage en C, mais un problème de compilation survient :

char* s[] = {   "a", "4A63",
                "b", "F8C1",
                "c", "70AE",
                "d", "752F"
            };

Build error: The command 'arm-none-eabi-gcc.exe' failed with exit code 1.

Auriez-vous des pistes pour encoder cette table dans le programme ?
Merci.

Salut,

Pour l’erreur en elle-même, c’est difficile à dire comme cela, tu n’as pas davantage de détails ou un message d’erreur plus précis ? Sinon, pour ton tableau, si cela reste une correspondance caractères ASCII -> nombre tu peux initialiser ton tableau comme suit.

#include <stddef.h>
#include <stdio.h>


char *tab[] = {
        ['a'] = "4A63",
        ['b'] = "F8C1",
        ['c'] = "70AE",
        ['d'] = "752F"
};


int
main(void)
{
        char t[] = { 'a', 'b', 'c', 'd' };

        for (size_t i = 0; i <  sizeof t; ++i)
                printf("tab['%c'] = %s\n", t[i], tab[t[i]]);

        return 0;
}

Si cela ne te dit rien, je t’invite à regarder la section « initialisation sélective » de ce chapitre.

+2 -0

Merci pour ta réponse rapide !
Elle résout mon problème.

J’ai pris le temps de lire la section concernant l’initialisation sélective, et j’ai quelques questions sur ton code.
Plus par curiosité qu’autre chose ! :lol:

Pour l’erreur en elle-même, c’est difficile à dire comme cela, tu n’as pas davantage de détails ou un message d’erreur plus précis ?

Malheureusement non, mais je code sur deux environnements différents.

Le premier environnement est celui lié à un système embarqué.
Le deuxième est l’environnement standard lorsqu’on programme en débutant.

Le deuxième environnement ne renvoie aucune erreur de compilation, ni d’exécution, pour le code initial.

int main(void)
{
        char* s[] = {   "a", "4A63",
                "b", "F8C1",
                "c", "70AE",
                "d", "752F"
            };

        return 0;
}

#include <stddef.h>

A quoi sert cet include dans le code ?

Dans le cas où la longueur du tableau n’est pas précisée, le compilateur déduira la taille du tableau du plus grand indice utilisé lors de l’initialisation sélective.

Si je me réfère à cette phrase, tu as donc initialisé à la ligne 5 dans ton code, un tableau de 101 pointeurs.
Les 97 premiers pointeurs sont NULL et les 4 derniers sont définis explicitement.

Par conséquent, tab[5] est une expression autorisée dans le programme ?

main.c:19:53: warning: array subscript has type ‘char’ [-Wchar-subscripts]

Comment éviter cet avertissement ?

Merci pour ta réponse rapide !
Elle résout mon problème.

Green

Bonne nouvelle. :)

#include <stddef.h>

A quoi sert cet include dans le code ?

Green

L’en-tête <stddef.h> comprend plusieurs définitions de type dont size_t. En vrai, ce n’est pas nécessaire parce que <stdio.h> l’inclut déjà (le prototype de la fonction fread() en a besoin par exemple), mais je préfère inclure moi-même les en-têtes nécessaires, même si c’est redondant. ^^

Dans le cas où la longueur du tableau n’est pas précisée, le compilateur déduira la taille du tableau du plus grand indice utilisé lors de l’initialisation sélective.

Si je me réfère à cette phrase, tu as donc initialisé à la ligne 5 dans ton code, un tableau de 101 pointeurs.
Les 97 premiers pointeurs sont NULL et les 4 derniers sont définis explicitement.

Green

Yep, c’est correct si c’est bien la table ASCII qui est utilisée pour la correspondance caractère -> nombre. :)

Par conséquent, tab[5] est une expression autorisée dans le programme ?

Green

En effet.

main.c:19:53: warning: array subscript has type ‘char’ [-Wchar-subscripts]

Comment éviter cet avertissement ?

Green

Tu peux changer le type du tableau t pour en faire un tableau de int ou alors effectuer une conversion explicite : tab[(int)t[i]]. ;)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte