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 :

tableau a 2 dimensions de struct


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut tableau a 2 dimensions de struct
    Bonjour,

    Comme l'intitule le dis, j'ai un soucis pour un tableau a 2 dimensions de struct. Voici ce qui ne va pas :
    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
     
    // Voici ma structure
    struct sDefModule
    {
        BYTE m_ReponseModule;
        BYTE m_AntiRebondModule;
    };
     
    typedef struct sDefModule sModule;
     
    // Dans le main:
     
    sModule m_sModule[4][55 ];
     
    // Et voici la ligne qui deconne
    m_sModule[0][0].m_ReponseModule = 0;
    Le compilateur me dit " left side of '.' requires struct/union."

    Comment ca se fait vu que c'est une structure ....

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut
    TT mon code avant tournait (depuis 1 an) et j'ai rajoute juste les lignes qui sont ci dessus et le compilateur n'en veut pas.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut
    Hehe ce ne peut pas etre ca non plus car mon BYTE n'est qu'un typedef d'un unsigned char :-) Mais j'ai essaye quand meme et ca ne chnage rien.
    J'utilise CAVR et c'est pour de l'embarque et j'ai vraiment l'impression que ce n'est que le compilateur qui ne gere pas ca....

  4. #4
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par pitch21
    Hehe ce ne peut pas etre ca non plus car mon BYTE n'est qu'un typedef d'un unsigned char :-) Mais j'ai essaye quand meme et ca ne chnage rien.
    J'utilise CAVR et c'est pour de l'embarque et j'ai vraiment l'impression que ce n'est que le compilateur qui ne gere pas ca....
    http://www.hpinfotech.ro/html/cvavr_doc.htm

    Télécharger cvarman.zip (contient le manuel utilisateur au format PDF) puis lire attentivement le chapitre 3, et notamment §3.22 .

    Donc oui il s'agit bien ici du compilateur.

    Quel était le compilateur précédent et quel est le micro cible si ce n'est pas indiscret ?

    A+

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut
    le compilateur ca a tjs ete le meme :-), c'est juste que j'optimisai le code en vue d'une ajoute mais helas je ferai l'ajoute sans l'optimisation. Le micro c un ATMega128 de chez Atmel.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben à ce compte-là pourquoi ne pas faire un tableau à une dimension et calculer toi-même l'adresse ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sModule m_sModule[4*55 ];
     
    int i = 2 ; /* premier indice */
    int j = 33 ; /* 2ième indice */
     
    // Et voici la ligne qui deconne
    m_sModule[0].m_ReponseModule = 0;
    ...
    m_sModule[i*55+j].m_ReponseModule = 0;
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par pitch21
    le compilateur ca a tjs ete le meme :-), c'est juste que j'optimisai le code en vue d'une ajoute mais helas je ferai l'ajoute sans l'optimisation. Le micro c un ATMega128 de chez Atmel.
    Oui mais si je lis bien, d'après ton second post, c'est le fait d'avoir rajouté un tableau de structures à 2 dimensions qui fait que cela coince.

    Et comme la doc le dit, ce n'est pas supporté par CAVR. Heureusement, la doc elle dit aaussi que malgré tout les tableaux 1D de structures sont supportés. Cf chapitre 3 du lien que j'ai envoyé. Il existe une solution si tu veux simuler un tableau 2D avec un tableau 1D :

    Pour la i-ème ligne (Nb_I lignes) et la j-ème colonne (Nb_J colonnes),

    tableau2D_simule[i][j] = tableau1D[i*Nb_J + j]

    De même,

    tableau3D_simule[i][j][k] = tableau1D[i*Nb_J*Nb_K + j*Nb_K + k]

    tableau4D_simule[i][j][k][l] = tableau1D[i*Nb_J*Nb_K*Nb_L + j*Nb_K*Nb_L + k*Nb_L + l]

    et ainsi de suite ...

    Un exple :

    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
    34
    35
    #include <stdio.h>
     
    #define TO_IDX_1D(i, j) convertTo1Dindex( (i), (j), 55)
     
    typedef unsigned char BYTE;
     
    struct sDefModule
    {
        BYTE m_ReponseModule;
        BYTE m_AntiRebondModule;
    };
     
    typedef struct sDefModule sModule;
     
    static int convertTo1Dindex(int i, int j, int nbCols) {
       int res = 0;
       if (i >=0 && j>=0 && nbCols >=0) {
         res = i*nbCols + j;
       }
       return res;
    }
     
    int main(void) {
     
       sModule m_sModule[4*55];
     
       m_sModule[TO_IDX_1D(0,0)].m_ReponseModule = 5u;
       m_sModule[TO_IDX_1D(3,46)].m_ReponseModule = 123u;
     
       printf("%u\n", m_sModule[TO_IDX_1D(0,0)].m_ReponseModule);
       printf("%u\n", m_sModule[TO_IDX_1D(3,46)].m_ReponseModule);
     
       return 0;
     
    }
    A+

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut
    J'ai pas reflechis très longtemps sur le sujet car doit mixer d'autres choses en meme tems mais ton explication m'a l'air totalement fondee vu qu'en memoire un 2D n'est jamais qu'un 1D 'chaine' (je me comprends :-))
    Merci de m'avoir mis se petit detail, je m'y mets des que j'ai le temps :-)
    Merci :-)

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/11/2005, 19h55
  2. Réponses: 13
    Dernier message: 13/10/2005, 16h03
  3. Tableau a trois dimension!!!
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/10/2005, 15h52
  4. Réponses: 1
    Dernier message: 30/09/2005, 19h17
  5. [Tableau]comment connaitre la taille d'un tableau à 2 dimensions
    Par Kyti dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 22/04/2005, 10h27

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