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 :

Array d'un struct


Sujet :

C++

  1. #1
    soa
    soa est d�connect�
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    53
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 53
    Par d�faut Array d'un struct
    Bonjour

    Alors voil�, je code un programme pour un ESP32-P4 (MCU), et je suis face � une erreur de d�butant que je n'arrive pas � corriger.

    Dans mon driver:
    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
    typedef struct rex_device_struct{
      bool detected = false;
      char type[10];
    };
     
     
    rex_device_struct* RexDriver::rexDetected(){
      rex_device_struct *devices_struct = (rex_device_struct *)ps_malloc(sizeof(rex_device_struct*) * REX_MAX_DEVICES_SUPPORTED);
     
      for (uint8_t i; i < REX_MAX_DEVICES_SUPPORTED; i++){
        devices_struct[i].detected = false;
        strcpy(devices_struct[i].type, "");    
      }
     
      devices_struct[0].detected = true;
      strcpy(devices_struct[0].type, "REX12D");
     
      return (rex_device_struct*)devices_struct;
    }
    Quand je fait appel � cette fonction, je me retrouve avec des donn�es fauss�es, respectivement le champ "detected" est mal �valu� (il ne devrait afficher que le Rex device 1).
    Pire quand j'appelle la commande free pour lib�rer la m�moire, le MCU plante (HEAP corrompu).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    rex_device_struct *devices_struct = rex.rexDetected();
     
    for (uint8_t i = 0; i < REX_MAX_DEVICES_SUPPORTED; i++){
            if (devices_struct[i].detected){
              Serial.printf("Rex device: %u: %s\n", i, devices_struct[i].type);
            }       
          }
          Serial.println((String)"Memory available in PSRAM : " +ESP.getFreePsram()+"/"+ESP.getPsramSize());
          //free(devices_struct);
    R�sultat:
    Rex device: 0: REX12D
    Rex device: 1: ����⪪�
    Rex device: 3: ��맪�Z<��
    Rex device: 5: ��ϫ����xV
    Rex device: 9: ꪮ�=����
    Rex device: 11: ��������*�
    Rex device: 13: �ꨪ������
    Rex device: 15: ��=������

    Bref, comme vous l'aurez deviner je d�bute en C++, et je m'arrache les cheveux.

    Quelqu'un saurait m'aider � corriger l'erreur?

    Merci!

  2. #2
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 511
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 511
    Par d�faut
    Bonjour,

    � la ligne 8 :

    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    rex_device_struct *devices_struct = (rex_device_struct *)ps_malloc(sizeof(rex_device_struct*) * REX_MAX_DEVICES_SUPPORTED);

    Tu n'alloues pas de la place pour n � devices_struct �, mais pour n pointeurs vers des devices_struct. Tu te retrouves forc�ment en d�passement de tampon lorsque tu cherches � les exploiter ensuite.

    Par ailleurs, m�me si ton code est globalement propre sur le plan syntaxique, c'est plus du C que du C++. Il faudra choisir un paradigme et basculer enti�rement vers lui ensuite.

  3. #3
    soa
    soa est d�connect�
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    53
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 53
    Par d�faut
    C'�tait bien �a.

    Je prends note de tes conseils.

    Merci beaucoup.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par d�faut
    Hello,

    Ce code source, c'est du C.
    Rien � voir avec du C++.

    En C+:
    - Les tableaux c'est std::array ou std::vector.
    - On alloue la m�moire dynamiquement via les pointeurs intelligents (std::unique_ptr), ou au pire (fortement d�conseill�) via l'op�rateur new.
    - On travaille un maximum de temps avec des r�f�rences.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 3
    Dernier message: 01/09/2013, 22h45
  2. Segmentation fault - Struct d'array
    Par AlbinOSG dans le forum C
    R�ponses: 9
    Dernier message: 07/12/2011, 13h46
  3. uniform struct array ?
    Par adtunum dans le forum OpenGL
    R�ponses: 1
    Dernier message: 13/06/2010, 02h39
  4. [C++ -> C#] Struct et arrays
    Par Iv�n Y. dans le forum C++/CLI
    R�ponses: 1
    Dernier message: 09/09/2009, 11h32
  5. R�ponses: 1
    Dernier message: 05/06/2007, 19h46

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