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 :

Probleme avec un tableau dynamique


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2024
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 26
    Par d�faut Probleme avec un tableau dynamique
    j'ai un probl�me d'initialisation de mon tableau, voici la partie du code :

    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
     
    class Tools : public LiquidCrystal_I2C {
    private:
     
      bool   flagWrite;   
      // String ligne[nombreLignes];
      char** ligne;
      String tamponLigne;
      void _write(String value);      
      uint8_t nombreLignes;
      uint8_t nombreColonnes;    
     
    public:
      // Constructeur     
      Tools(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) : LiquidCrystal_I2C(lcd_Addr,lcd_cols,lcd_rows) {
        ligne = new char*[lcd_rows];
        for (int i = 0; i < lcd_rows; i++)  ligne[i] = new char*[lcd_cols];
        nombreLignes = lcd_cols;
        nombreColonnes = lcd_rows;    
      };
    le but est de cr�er un tableau de chaines de caract�res fixes d�pendant des param�tres du constructor.

    une fois que le probl�me sera r�solu, comment acc�der a une chaine particuli�re dans le tableau pour lui lui assigner "coucou" par exemple ?

    Si vous pouviez m'�clairer, ce serait vraiment sympa. Je d�bute en C++, alors un peu d'indulgence s'il vous plait. Merci.

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    D'o� sort ce type "String" ???
    Ce n'est pas un type de variable "standard".
    Ca vient des MFC ou du C++/CLI de M$ ?

    De toute fa�on, ce n'est pas en utilisant des tableau "� la C" (type ligne[...]) et l'allocation dynamique � la mode des ann�es 70 (new) que vous allez faire un truc "correcte" en C++.
    Les pointeurs nus (char**), en C++, c'est tr�s tr�s suspect.
    Les identifiants qui commencent par un "_" (_write), c'est d�conseill� en C++, mais je crois qu'en C aussi.
    Non utilisation de r�f�rences (_write(String value) � la place de _write(String& value)), �a pue.


    J'esp�re que vous avez ces reflexe parce que vous �tes un programmeur C et pas que le cours de C++ que vous potassez vous apprend ces "conneries".

    Pour un tableau de taille variable, je vous conseille, en premi�re impl�mentation, d'utiliser un simple "std::vector<>".
    Si votre cours de C++ est correct, il doit aborder ce type de classe de la STL quasiment d�s le d�but.

  3. #3
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Mis � part que tu as �crit class, rien de ce code n'est du C++.
    Un tableau dynamique c'est std::vector.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  4. #4
    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,

    Tu sembles vouloir cr�er un tableau � 2 dimensions de caract�res.
    La premi�re question � se poser est: est-ce que le nombre de ligne et le nombre de colonnes sont des constantes de compilation? Cela peut sensiblement simplifier la gestion si c'est le cas.
    Si les 2 sont variables, c'est un peu plus lourd.

    La solution la plus triviale consiste � remplacer ligne par std::vector<std::string>> table;. Les lignes sont les �l�ments du vector, un std::vector<> c'est justement un tableau dont le nombre d'�l�ments est variable. Le constructeur s'�crit alors:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    Tools( uint8_t lcd_Addr, uint8_t lcd_cols, uint8_t lcd_rows )
        : LiquidCrystal_I2C(lcd_Addr,lcd_cols,lcd_rows)
        ,  table(lcd_rows,std::string(lcd_cols,' ')), nombreLignes{lcd_rows}, nombreColonnes{lcd_cols} {
      }
    �a initialise la table avec cha�nes compos�es de lcd_cols espaces.

    Ensuite pour changer une des lignes, on peut faire: table[lg] = "coucou";. Mais pour conserver le bon nombre de colonnes, il faut peut-�tre ajouter des espaces apr�s le "coucou".
    Et il n'y a alors pas de new est de delete � g�rer, et heureusement. �a fait 30 ans que je fait du C++ et je ne me risque jamais � utiliser ce genre de choses.

  5. #5
    Mod�rateur
    Avatar de al1_24
    Homme Profil pro
    Retrait�
    Inscrit en
    Mai 2002
    Messages
    9 135
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 64
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Retrait�
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par d�faut
    L'information que herrflick13 a oubli� de mentionner, c'est qu'il programme pour un microcontr�leur AVR (ATMega 328P en environnement Arduino) avec une m�moire limit�e (32Ko de flash pour les programmes, 2Ko de RAM).
    La biblioth�que standard du C++ a �t� simplifi�e et vector n'en fait pas partie.
    Quant � String, c'est une classe propre � la biblioth�que Arduino qui permet de g�rer des cha�nes de caract�res de mani�re dynamique.

    Les solutions que vous proposez sont adapt�es � des environnements plus "larges".
    Mod�rateur Langage SQL
    R�gles du forum Langage SQL � lire par tous, N'h�sitez pas � consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une r�ponse vous a aid� � r�soudre votre probl�me, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un probl�me expos� sans mentionner les tentatives de r�solution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail � sa place... et ne donne pas envie d'y r�pondre.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Mis � part que tu as �crit class, rien de ce code n'est du C++.
    Un tableau dynamique c'est std::vector.
    Je ne pense pas que le gars postule pour le prix Goncourt de la meilleure prose en C++ !
    Il cherche juste � mettre en place un dispositif et un m�canisme dont � titre perso, je ne comprend pas l'utilit�.

    Pourquoi m�moriser en RAM des caract�res qui, pour pouvoir �tre affich�s, seront le moment venu m�moris�s dans la RAM du LCD ?
    Pour rafra�chir l'affichage ?

    Si par contre, c'est quelque chose pour faire du transfert par bloc dans ce cas :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    // tout peut dépendre de la taille de la font utilisée... donc on prévoit des maximas pour le LCD donné
    char Screen[max_row * max_char];
    A charge apr�s de bien segmenter le bloc (nb_rows et nb_col) pour y �crire � tel ligne et � partir de tel caract�re...
    Mais je doute que ce soit �a !

  7. #7
    Membre chevronn�
    Avatar de ABD-Z
    Homme Profil pro
    Ing�. webapps embarqu�es � Admin/mainteneur serveur/BDD � Formateur WordPress � Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    302
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 28
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Ing�. webapps embarqu�es � Admin/mainteneur serveur/BDD � Formateur WordPress � Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 302
    Billets dans le blog
    3
    Par d�faut
    J'ai l'impression qu'il y a une �toile en trop. Enl�ve l'�toile de cette ligne
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ligne[i] = new char*[lcd_cols];
    Ceci dit j'aimerais bien avoir le message d'erreur.

    Si tu as trouv� la solution, n'oublie pas de mettre en r�solu

    Citation Envoy� par herrflick13 Voir le message
    j'ai un probl�me d'initialisation de mon tableau, voici la partie du code :

    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
     
    class Tools : public LiquidCrystal_I2C {
    private:
     
      bool   flagWrite;   
      // String ligne[nombreLignes];
      char** ligne;
      String tamponLigne;
      void _write(String value);      
      uint8_t nombreLignes;
      uint8_t nombreColonnes;    
     
    public:
      // Constructeur     
      Tools(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) : LiquidCrystal_I2C(lcd_Addr,lcd_cols,lcd_rows) {
        ligne = new char*[lcd_rows];
        for (int i = 0; i < lcd_rows; i++)  ligne[i] = new char*[lcd_cols];
        nombreLignes = lcd_cols;
        nombreColonnes = lcd_rows;    
      };
    le but est de cr�er un tableau de chaines de caract�res fixes d�pendant des param�tres du constructor.

    une fois que le probl�me sera r�solu, comment acc�der a une chaine particuli�re dans le tableau pour lui lui assigner "coucou" par exemple ?

    Si vous pouviez m'�clairer, ce serait vraiment sympa. Je d�bute en C++, alors un peu d'indulgence s'il vous plait. Merci.

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

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

    Effectivement, si l'on a pas acc�s a std::vector, il ne reste plus que les pointeurs nu.

    Par contre, instancier des tableaux de tableaux (soit un tableau 2D), ca fout le bordel dans la memoire, tous les emplacements ne seront pas contigus.
    Pour y rem�dier, il n'y a pas 36 solutions: Lineariser le tableau � l'aide d'une classe (consid�rer un tableau 1D comme un tableau 2D), et par respect du SRP, �crire une classe qui ne s'occupe que de cela:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <cassert>    // Inclure si disponible
     
    class Table2D
    {
        private:
            char *mTable;
            unsigned mColonnes;
            unsigned mLignes;
        public:
            Table2D(unsigned colonnes, unsigned lignes);
            char get(unsigned x, unsigned y) const;
            void set(char value, unsigned x, unsigned y
            ~Table2D();
    };
    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
    Table2D::Table2D(unsigned colonnes, unsigned lignes):
        mTable = new char[colonnes * lignes]
    {
    }
     
    char Table2D::get(unsigned x, unsigned y) const
    {
        assert(x < mColonnes && y < mLignes);    // Pas obligatoire mais souhaitable
        return mTable[x + y * mColonnes);
    }
     
    void Table2D::set(char value, unsigned x, unsigned y)
    {
        assert(x < mColonnes && y < mLignes);    // Pas obligatoire mais souhaitable
        mTable[x + y * mColonnes] = value;
    }
     
    Table2D::~Table2D()
    {
        delete mTable[];
    }

  9. #9
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par d�faut
    Hello,

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    nombreLignes = lcd_cols;
    nombreColonnes = lcd_rows;
    �a ma para�t pas tr�s logique

    Il y a aussi effectivement une erreur � cette ligne

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ligne = new char*[lcd_rows];
    L'�toile est � retirer. Et si la m�moire est un probl�me, peut-�tre il serait mieux d'utiliser un tableau statique non ?

  10. #10
    Membre chevronn�
    Avatar de ABD-Z
    Homme Profil pro
    Ing�. webapps embarqu�es � Admin/mainteneur serveur/BDD � Formateur WordPress � Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    302
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 28
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Ing�. webapps embarqu�es � Admin/mainteneur serveur/BDD � Formateur WordPress � Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 302
    Billets dans le blog
    3
    Par d�faut
    Citation Envoy� par fred1599 Voir le message

    Il y a aussi effectivement une erreur � cette ligne

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ligne = new char*[lcd_rows];
    L'�toile est � retirer. Et si la m�moire est un probl�me, peut-�tre il serait mieux d'utiliser un tableau statique non ?
    En effet, j'ai d�tect� l'erreur d�s le d�but...

    Mais les gens pr�f�rent diverger...

    Une personne a bien mentionn� que son environnement est embarqu�, donc diff�rent d'un Cpp standard sur PC.

  11. #11
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    +1 � la solution de deedolith -- quitte � tout red�velopper soi-m�me, ceci dit il y a des libs pr�tes � l'emploi sur github qui fournissent des vecteurs simplifi�s pour arduino.

    Ceci dit,

    a- c'est le mauvais delete qui est utilis� dans le destructeur -> delete[]

    b- je rendrais bien la classe [EDIT]non-[/] copiable histoire que l'OP ne tombe pas sur des erreurs qui font tout planter sur un malentendu -- EDIT: dans tous les cas en l'�tat sa copie va planter, et le chemin de l'effort minimal consiste � interdire la copie dans un premier temps

    c- Je pr�f�re passer par la surcharge de l'op�rateur [] plut�t que get et set -- et une fonction interm�diaire qui factorise le calcul d'offset qui qui sera inlin�e par le compilo in fine

    d- on peut aussi imaginer un Tableau1D<String> (pas s�r pour "String") qui permet de bien g�rer le c�t�: c'est un tableau de chaines et il va falloir g�rer les probl�mes de longueurs diff�rentes.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Probl�me avec filtre tableau crois� dynamique
    Par sebfch dans le forum Macros et VBA Excel
    R�ponses: 11
    Dernier message: 22/04/2016, 12h06
  2. Probl�me avec les tableau crois�s dynamiques
    Par kariel dans le forum WinDev
    R�ponses: 3
    Dernier message: 23/10/2014, 15h25
  3. Probl�me avec le tableau crois� dynamique
    Par aritas dans le forum QlikView
    R�ponses: 2
    Dernier message: 25/04/2014, 10h50
  4. R�ponses: 7
    Dernier message: 24/11/2006, 09h56

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