IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

comment acceder directement à un tableau de tableau de const byte dans une structure ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut comment acceder directement à un tableau de tableau de const byte dans une structure ?
    Bonjour,

    je voudrais définir un menu de plusieurs ligne sur un afficheur LCD 4 lignes de 20 caractères et j'ai un problème pour y accéder via une fonction.
    je précise que je programme en 'C' mais pour microcontrôleur 32 bit. (pas pour windows donc)
    j'utilise aussi une redefinition de type pour unsigned char en BYTE.

    voici mon code, se sera plus simple qu'une foule d’explication.

    le menu pouvant être écrit en plusieurs langues, je déclare les texte dans un fichier texte.c et texte.h pour permettre leur utilisation dans d'autre fichier.
    j'utilise le const car elle doivent être placée en ROM et non en RAM pour un gain de place en RAM.

    texte.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    const BYTE *tbl_TXT_ligne_1 [] = {	
    		"ligne_1_FR",   //FR
    		"ligne_1_NL",   //NL
    		"ligne_1_UK",   //UK
    		"ligne_1_DE"    //DE
    };
    const BYTE *tbl_TXT_ligne_2 [] = {	
    		"ligne_2_FR",   //FR
    		"ligne_2_NL",   //NL
    		"ligne_2_UK",   //UK
    		"ligne_2_DE"    //DE
    };
    et bien sur le texte.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern const BYTE *tbl_TXT_ligne_1 [];
    extern const BYTE *tbl_TXT_ligne_2 [];
    menu.h pour la declaration du menu (qui peut contenir plusieurs lignes 3, 4 u 7 par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct struct_menu {
    	BYTE nbr_ligne;
    	const BYTE** tbl_ligne[10];
    }DEF_MENU,*PDEF_MENU;
    menu.c qui initialise une variable de type menu et qui contient la fonction l'utilisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DEF_MENU MENU_principale = {
    		.nbr_ligne = 2,
    		.tbl_ligne = {
    			tbl_TXT_ligne_1,
    			tbl_TXT_ligne_2},
    };
    et un extrait du code de la fonction l'utilisant.
    remarque: la fonction prv_Copy_null_teminated_string prend en argument (const BYTE tbl_texte_a_imprimer []).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    VOID prv_Affichage_menu (PDEF_MENU pt_menu, BYTE indice_langue) {
     
    const BYTE **tbl_texte;
     
    	tbl_texte = pt_menu->tbl_ligne[0];
            prv_Copy_null_teminated_string (tbl_texte [indice_langue]);
    }
    et bien sur le code appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    prv_Affichage_menu (&MENU_principale, CONST_LANGUE_FR);

    le code ne provoque aucune erreur, ni aucun warning et fonctionne bien.

    mais ma question est : quelle serait la syntax pour ne pas passer par l'emploi de la variable local tbl_texte dans l'appel de la fonction prv_Copy_null_teminated_string ???
    du style ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    prv_Copy_null_teminated_string (pt_menu->tbl_ligne[0][indice_langue])
    ce code par contre ne fonctionne pas !!!
    j'espere avoir été assez clair et merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Il manque une parenthèse, l'expression est comprise sous la forme prv_Copy_null_teminated_string( pt_menu->(tbl_ligne[0][indice_langue]) );, il faut écrire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prv_Copy_null_teminated_string( (pt_menu->tbl_ligne[0])[indice_langue] );

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Super, ça marche.

    merci beaucoup.

  4. #4
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    ???

    Je viens de faire un test avec GCC 7.1.0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <stdio.h>
     
    typedef char BYTE;
    typedef void VOID;
     
    typedef struct struct_menu {
    	BYTE nbr_ligne;
    	const BYTE** tbl_ligne[10];
    } DEF_MENU, *PDEF_MENU;
     
    VOID prv_Copy_null_teminated_string(const BYTE* str) {}
     
    VOID prv_Affichage_menu(PDEF_MENU pt_menu, BYTE indice_langue)
    {
    	// Ça compile :
    	const BYTE** tbl_texte = pt_menu->tbl_ligne[0];
    	prv_Copy_null_teminated_string( tbl_texte[indice_langue] );
     
    	// En une ligne, ça compile aussi :
    	prv_Copy_null_teminated_string( pt_menu->tbl_ligne[0][indice_langue] );
     
    	// Avec des parenthèses redondantes, ça compile aussi :
    	prv_Copy_null_teminated_string( ( pt_menu->tbl_ligne[0] )[indice_langue] );
     
    	// Avec des parenthèses mal placées, on a une erreur de compilation :
    //	prv_Copy_null_teminated_string( pt_menu->( tbl_ligne[0][indice_langue] ) );
    }
     
    int main()
    {
    	printf("GCC version: %s\n\n", __VERSION__);
    	return 0;
    }

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Mea culpa, en effet les parenthèses que j'ai préconisées ne servent à rien.

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Il aurait fallu que l'OP nous précise ce qui « ne fonctionne pas »..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. simplehtmldom : comment acceder au contenu d'un tableau
    Par altair8080 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 01/07/2012, 09h13
  2. Comment acceder à l'index d'un tableau
    Par lenissart dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/08/2009, 14h39
  3. Réponses: 3
    Dernier message: 19/08/2008, 14h55
  4. Comment acceder directement a mon site
    Par jeha dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 15/05/2007, 11h50
  5. Réponses: 6
    Dernier message: 16/02/2006, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo