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 :

Initialisation d'un tableau de 2 dimensions de structures


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Par défaut Initialisation d'un tableau de 2 dimensions de structures
    Bonjour,

    j'ai récupérer du code source qui défini une structure I2C_UNIT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct I2C_UNIT
    {   
    Hal_Queue_UnknownSize<I2C_WORD> m_dataQueue;
    size_t                          m_bytesTransferred;
    size_t                          m_bytesToTransfer;
    BOOL                           m_fRead;
     
    BOOL I2C_Initialize();
    BOOL I2C_Uninitialize();
    BOOL I2C_Enqueue( I2C_ACTION* action);
    void I2C_Cancel( I2C_ACTION* action, bool signal );
    };
    Je souhaite allouer de la mémoire pour un tableau 2 dimensions de cette structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int j = 0;
     
    I2C_UNIT** tActionU= (struct I2C_UNIT**)calloc(6,sizeof(struct I2C_UNIT*));
     
    for(j = 0; j < 6; j++) *(tActionU+j)= (struct I2C_UNIT*)calloc(1,sizeof(struct I2C_UNIT));
    Mon programme fonctionne correctement lorsque je n'alloue pas la mémoire, mais il reste bloquer sur ces lignes de codes lorsque je les ajoutent.

    Auriez-vous une idée?

    Cordialement,
    Lionel.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    BOnjour,

    Il me semble que ta question releve plus du C++ que du C...

    Cependant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *(tActionU+j) = /* [...] */;
    est incorrect à moi que tes structures ne soient de taille 1 octets (ce qui a priori n'est pas le cas!)

    Le code correct à écrire est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tActionU[j] = (struct I2C_UNIT*) calloc (1, sizeof(struct I2C_UNIT));
    // ou
    *(tActionU + j * sizeof (struct I2C_UNIT)) = (struct I2C_UNIT*) calloc (1,  sizeof(struct I2C_UNIT));
    Voilà au moins une erreur...

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Si tu es en C++, l'utilisation calloc/malloc est une erreur -> préférer new/delete pour les constructeurs/destructeurs.
    Si tu es en C++, il existe des choses comme std::vector pour éviter les allocations dynamiques explicites.
    Si tu es en C++, utilise des pointeurs intelligents plutôt que des pointeurs nus.
    Pourquoi utiliser un tableau à 2 dimensions puisque :
    1/ Toutes les lignes sont de même taille ?
    2/ Toutes les lignes ont une taille de 1 ?

    Enfin, si tu es dans un environnement où tu ne peux utiliser ni std::vector, ni pointeur intelligent (ce qui me surprendrait puisque tu as des template et que tu fais de l'allocation dynamique) et que tu es obligé de passer par ces allocations non safe, ce devrait plutôt ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int j = 0;
     
    I2C_UNIT** tActionU= new I2C_UNIT*[6];
     
    for(j = 0; j < 6; j++)
    {
        tActionU[j] = new I2C_UNIT[1];
    }
     
    // destruction avec delete[] et non delete tout seul
    @Fabllot : Et l'arithmétique des pointeurs ? *(tActionU+j) <=> tActionU[j]

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    @Fabllot : Et l'arithmétique des pointeurs ? *(tActionU+j) <=> tActionU[j]
    Mea Culpa... J'ai confondu *(tActionU+j) avec (*tActionU)+j ...
    Ceci dit, le passage par tableau (ou vector) evite ce genre d'erreur !

Discussions similaires

  1. Initialisation d'un tableau de 2 dimensions
    Par Alaa-linux dans le forum C
    Réponses: 5
    Dernier message: 18/07/2013, 14h12
  2. initialiser a tableau de deux dimension
    Par can48yous dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/06/2008, 10h44
  3. Tableau en deux dimensions et structure.
    Par PKO06 dans le forum C
    Réponses: 4
    Dernier message: 10/07/2007, 14h22
  4. Initialisation d'un tableau à plusieurs dimensions
    Par kinouseb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2007, 13h16
  5. Réponses: 7
    Dernier message: 30/01/2007, 09h48

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