Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un tableau de char a deux dimension

    6 avril 2008 à 16:43:00

    bonjour,
    je poste beaucoup sur le forum aujourd'hui :D .
    Mais on me repond pas beaucoup :( .
    Bon, je contourne plus ou moin mes problemes, ça ralonge mon code mais bon.
    J'ai besoin d'un tableau de char a deux dimension, pour stoquer le contenue de plusieurs fichiers.
    Dans ces fichiers il y a les colonnes d'un tableau que je veux remplir.
    Donc je voudrais un tableau : colonne[nombre_de_fichier][nombre de colonne].
    Le nombre de fichier est variable, pas le nombre de colonne.
    J'ai fait comme indiqué dans la faq de developez.com, c'est a dire :
    1. dim1 = m_nbcheval;
    2.     dim2 = 7;
    3.     dim_allouee = 0;
    4.     try
    5.     {
    6.         // dimension 1 : tableau de 10 pointeurs vers des tableaux d'entiers
    7.         colonne = new char * [ dim1 ];
    8.         // initialiser les 10 pointeurs à 0 (NULL)
    9.         std::fill_n( colonne, dim1, static_cast<char*>( 0 ) );
    10.         // dimension 2 : les tableaux d'entiers
    11.         for ( dim_allouee = 0; dim_allouee < dim1; ++dim_allouee)
    12.         {
    13.             colonne[ dim_allouee ] = new char[ dim2 ];
    14.         }
    15.     }
    16.     catch ( const std::bad_alloc & ) // erreur d'allocation
    17.     {
    18.         // désallouer tout ce qui a été alloué avec succès
    19.         for ( i = 0; i < dim_allouee; ++i )
    20.         {
    21.             delete [] colonne[ i ];
    22.         }
    23.         delete [] colonne;
    24.     }

    Je ne pense pas avoir d'erreur a ce niveau la.
    Par contre apres, je veux remplir ce tableau. J'ai fait :
    1. for (i = 0 ; i < m_nbcheval ; i++)
    2.     {
    3.             colonne[i][0] = contenuFichiers[i].at(0);
    4.             colonne[i][1] = contenuFichiers[i].at(5);
    5.             colonne[i][2] = contenuFichiers[i].at(6);
    6.             colonne[i][3] = contenuFichiers[i].at(7);
    7.             colonne[i][4] = contenuFichiers[i].at(8);
    8.             colonne[i][5] = contenuFichiers[i].at(9);
    9.             colonne[i][6] = contenuFichiers[i].at(10);
    10.     }

    m_nbcheval correspond au nombre de fichiers.
    contenuFichiers est un tableau de QStringList qui contient toutes les lignes des fichiers.
    Je l'ai remplie comme ça :
    1. for (i = 0 ; i < m_nbcheval ; i++)
    2.     {
    3.         delete fichier;
    4.         delete liste;
    5.         fichier = new QFile("poney/" + lines.at(i));
    6.         fichier->open(QIODevice::ReadWrite | QIODevice::Text);
    7.         liste = new QTextStream(fichier);
    8.         while (!liste->atEnd())
    9.         {
    10.             line = liste->readLine(); // Lis la ligne sans le '\n'
    11.             contenuFichiers[i] += line;
    12.         }
    13.         fichier->close();
    14.     }

    Je me suis insprier de la doc pour faire ça, je ne pense pas que ça soit faux, mais si ça l'est ça pourrait expliquer bon nombre de mes problemes !
    Quand je compile tout ça, voila mes erreures :
    entree_sortie.cpp: In constructor 'Entree_Sortie::Entree_Sortie(QWidget*)':
    entree_sortie.cpp:49: error: incompatible types in assignment of 'char**' to 'QString* [0u][7]'
    entree_sortie.cpp:56: error: incompatible types in assignment of 'char*' to 'QString* [7]'
    entree_sortie.cpp:71: error: cannot convert 'const QString' to 'QString*' in assignment
    entree_sortie.cpp:72: error: cannot convert 'const QString' to 'QString*' in assignment
    entree_sortie.cpp:73: error: cannot convert 'const QString' to 'QString*' in assignment
    entree_sortie.cpp:74: error: cannot convert 'const QString' to 'QString*' in assignment
    entree_sortie.cpp:75: error: cannot convert 'const QString' to 'QString*' in assignment
    entree_sortie.cpp:76: error: cannot convert 'const QString' to 'QString*' in assignment
    entree_sortie.cpp:77: error: cannot convert 'const QString' to 'QString*' in assignment
    entree_sortie.cpp:121: error: no matching function for call to 'QTableWidgetItem::setText(QString*&)'

    bon voila, je suis bloquer ... j'espere avoir plus de succes sur ce topic :D .
    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      6 avril 2008 à 16:46:24

      Pouruqoi pas un std::vector<> si déjà tu utilises std::fill()
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        6 avril 2008 à 17:27:21

        Je vois pas de std::vector , mais je connais pas non plus ...
        J'ai repris la technique d'allocation de developez.com en remplaçant int par char, ça veut pas dire que je comprend tout ^^ .
        Je sais, c'est pas bien de copié sans comprendre mais bon ...
        • Partager sur Facebook
        • Partager sur Twitter
          6 avril 2008 à 17:56:19

          Citation : Ulrar

          Je sais, c'est pas bien de copié sans comprendre mais bon ...



          Tu as résumé tout ton problème dans cette phrase.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            6 avril 2008 à 18:04:05

            Ben, ils donnent un exemple d'allocation d'un tableau a deux dimmension mais sans vraiment le commenter, je risque pas de comprendre.
            Moi pour aller un tableau j'aurai simplement fait
            tableau = new QString[m_nbcheveau][7] .
            • Partager sur Facebook
            • Partager sur Twitter
              6 avril 2008 à 21:49:08

              L'exemple que l'on donne dans la FAQ de développez, c'est pour allouer une structure 2D, typiquement rectangulaire, i.e. : une matrice.
              La conclusion sous entendue, c'est : "voilà, c'est comme ça qu'il faut faire quand on veut réécrire de telles classes ; maintenant, il existe 150 classes de tableaux 2D et autres matrices (boost.multi_array, boost.uBlass, Blitz++, MTL, newmat, ...), choisissez-en une et servez-vous en."

              L'objet de haut niveau que tu veux manipuler me semble être un tableau de lignes, i.e. un tableau de chaines de caractères. Un std::vector<std::string> est ce qui se fera de mieux dans la bibliothèque standard du C++. Qt a sa solution.
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

              Un tableau de char a deux dimension

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown