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

Discussion :

Problème de type avec un tableau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 42
    Par défaut Problème de type avec un tableau
    Bonjour à tous,

    Je continue mon petit programme de calcul des structures en béton, et comme vous vous en doutez, j'ai de nouveau un bug pour lequel j'ai quelques difficulté alors que je sais que c'est tout con.

    j'ai en fait enregistré toutes mes variables issue de l'interface dans un tableau. Ce dernier est réutilisé pour effectuer tous les calculs et les résultats sont enregistré dans un nouveau tableau situé dans une classe annexe. J'utilise donc un accesseur pour récupérer ces valeurs pour l'afficher dans mon interface et là il bug.

    mon tableau:

    beton.h
    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
     
     
    #ifndef BETON_H_INCLUDED
    #define BETON_H_INCLUDED
    #include <string>
    #include <math.h>
    #include <QApplication>
     
    class Beton
    {
    public:
        Beton();
     
    //blabla
     
        double gettabCalculAs(int x, int y);   // accesseur des résultats 
     
    private:
     
        double tabCalculAs [1][4];     // résultats
    leur code:


    beton.cpp

    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
     
     
     
    using namespace std;
    #include "Beton.h"
     
    Beton::Beton()
     
        double Beton::gettabCalculAs(int x, int y)
        {
            return Beton::tabCalculAs[x][y];
     
        }
     
    // tabCalculAs est remplit avec des variable de type "double"
    méthode problématique de la MaFenetre.ccp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    Beton poutre; // nouvelle objet poutre
    
    void MaFenetre::calculBeton()
    {
    //blabla
    double i = poutre.gettabCalculAs[0][0];  //--> ligne problématique
    QString iQ.setNum(i);
    m_As->setText(iQ);  // j'affiche la valeur dans un QLineEdit
    
    //blabla
    }
    Réponse du compilateur. la ligne 313 est la ligne en rouge ci-dessus. le probleme a la ligne 317 est un problème équivalent.

    D:\c++\beton>mingw32-make
    mingw32-make -f Makefile.Debug
    mingw32-make[1]: Entering directory `D:/c++/beton'
    g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
    DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"c:\Qt
    \2010.04\qt\include\QtCore" -I"c:\Qt\2010.04\qt\include\QtGui" -I"c:\Qt\2010.04\
    qt\include" -I"." -I"c:\Qt\2010.04\qt\include\ActiveQt" -I"debug" -I"c:\Qt\2010.
    04\qt\mkspecs\win32-g++" -o debug\Beton.o Beton.cpp
    Beton.cpp: In member function 'double Beton::classAcier(std::string)':
    Beton.cpp:62: warning: control reaches end of non-void function
    g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
    DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"c:\Qt
    \2010.04\qt\include\QtCore" -I"c:\Qt\2010.04\qt\include\QtGui" -I"c:\Qt\2010.04\
    qt\include" -I"." -I"c:\Qt\2010.04\qt\include\ActiveQt" -I"debug" -I"c:\Qt\2010.
    04\qt\mkspecs\win32-g++" -o debug\MaFenetre.o MaFenetre.cpp
    MaFenetre.cpp: In member function 'void MaFenetre::calculBeton()':
    MaFenetre.cpp:313: error: invalid types '<unresolved overloaded function type>[i
    nt]' for array subscript
    MaFenetre.cpp:317: error: invalid types '<unresolved overloaded function type>[i
    nt]' for array subscript
    mingw32-make[1]: *** [debug/MaFenetre.o] Error 1
    mingw32-make[1]: Leaving directory `D:/c++/beton'
    mingw32-make: *** [debug] Error 2

    En vous remerciant d'avance ^^

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double tabCalculAs [1][4];
    C'est un tableau à 1 dimension donc écris à la place :
    Remarque : Si tu veux des tableaux dynamiques, penses bien à utiliser std::vector ou QVector et non les tableaux styles C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double Beton::gettabCalculAs(int x, int y)
        {
            return Beton::tabCalculAs[x][y];
        }
    En général, on ajoute un vérification des bornes du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double Beton::gettabCalculAs(int x, int y)
    {
       if (x >=0 && x < 1 && y >= 0 && y < 4)
          return Beton::tabCalculAs[x][y];
       else
          throw std::out_of_range("in Beton::gettabCalculAs");
    }
    ou avec un assert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double Beton::gettabCalculAs(int x, int y)
    {
       std::assert((x >=0 && x < 1 && y >= 0 && y < 4) && "out of range in Beton::gettabCalculAs");
       // ou Q_ASSERT_X((x >=0 && x < 1 && y >= 0 && y < 4), "Beton::gettabCalculAs", "out of range"
       return Beton::tabCalculAs[x][y];
    }
    Sinon, pour ton problème, il s'agit simplement d'une erreur de syntaxe : tu appeles ta fonction comme si c'était un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double i = poutre.gettabCalculAs(0,0);

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Autre petite erreur dans le .cpp:


  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 42
    Par défaut
    cool merci . En effet, je me doutais que c'était une erreur stupide, mais parfois, on tourne autour du pot sans trouver.

    concernant le reste du programme, c'est sûr que je devrais plus sécuriser mes méthodes, mais j'aimerais avant cela faire un début de programme qui tient la route avant de le sécuriser. Je sais que c'est pas la bonne manière, mais comme je débute, je passe pas mal de temps à courir sur le net et la doc pour avancer et je ne veux pas prendre trop de temps pour l'instant à blinder toutes mes entrées-sorties. J'ai en fait un peu peur de perdre le fil.

    Tant que j'y suis, dans le style petit truc stupide qui coince, j'ai un petit pépin avec un QButtonRadio. J'ai le choix entre deux possibilités, et j'aimerais que dans une méthode de la classe, cette dernière vérifie si l'une est activée ou non.

    le QRadioButton se situe dans le constructeur de MaFenetre

    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
    36
    37
    38
    39
     
    //blabla
     
    #include "MaFenetre.h"
    #include "Beton.h"
     
     
    // le constructeur
    MaFenetre::MaFenetre() : QWidget()
    {
     
        QGroupBox *groupRadioAs = new QGroupBox ("Armatures");
     
        m_radioAs = new QRadioButton("Armatures en traction");
        m_radioAss = new QRadioButton("Armatures en traction et compression");
        m_radioAs->setChecked(true);
     
        QVBoxLayout *vboxRadioAs = new QVBoxLayout;
        vboxRadioAs->addWidget(m_radioAs);
        vboxRadioAs->addWidget(m_radioAss);
     
        groupRadioAs->setLayout(vboxRadioAs);
     
    }
     
     
    // la méthode
     
    void MaFenetre::calculBeton()
    {
        if (m_radioAs->isChecked() == true)
        {
                poutre.calculAs();          // on exécute calculAs
        }
        else if (m_radioAs->isChecked() == false);
        {
                poutre.calculAss();          // on exécute calculAss
        }
    }
    Dans les fait, si m_radioAs est dès le départ,coché, il m'indiquera toujours "true", même si je le décoche. et inversément. Me manque-t-il qqch pour faire fonctionner ce damné QRadioButton?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Avec le code que tu nous fourni, j'aurais plutôt tendance à dire qu'il a le comportement suivant:
    • Si m_radioAs est coché, alors poutre.calculAs(); et poutre.calculAss(); sont tous les deux exécutés.
    • Si m_radioAs n'est pas coché, alors seul poutre.calculAss(); exécuté.

    Ton problème vient du point virgule qui s'est inséré à la fin de ta ligne de condition "fause":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (m_radioAs->isChecked() == false);
    Remarque: tu n'a pas besoin de mettre ==true ou ==false, la sortie de la fonction membre isChecked étant déjà booléenne, et un simple else suffit, vu que tu n'as que deux états possibles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (m_radioAs->isChecked())
    {
        poutre.calculAs();          // on exécute calculAs
    }
    else
    {
        poutre.calculAss();          // on exécute calculAss
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 42
    Par défaut
    Nickel

    Comme quoi, encore une erreur stupide. J'avais cru un moment qu'il fallait rajouter un slot-signal quelque part, mais non.

    Un tout grand merci pour ton aide !

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/04/2009, 13h42
  2. Probléme de type avec les contraintes
    Par kasse dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/04/2009, 14h06
  3. Problème de pointeurs avec un tableau
    Par Tom_Tom_RoF dans le forum Fortran
    Réponses: 8
    Dernier message: 05/10/2007, 17h34
  4. Problème de type avec Bison 2.3
    Par Faton dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 15/02/2007, 16h30
  5. problème de code avec un tableau
    Par richard038 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/05/2006, 17h35

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