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 :

Modifier un QVector dans une fonction

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 15
    Points
    15
    Par défaut Modifier un QVector dans une fonction
    Bonjour,

    Je cherche à modifier un QVector<double> qui est passé en paramètre dans une fonction qui est chargée de faire différents calculs et de le modifier au fur et à mesure.
    Dans la fonction, le QVector se modifie bien mais à la sortie de la fonction celui-ci conserve ses valeurs initiales, comme si je n'y avait pas touché.
    J'ai essayé de passé un QVector<double>& mais rien ne change.

    J'ai cherché un peu partout sur le net, mais aucune solution.

    Merci de votre aide.

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Merci de donner un bout de code. Sans c'est un peu dur...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Un exemple tout simple :

    Ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void maFonction(QVector<int> a){
    for(int i = 0; i < 10; i++){
       for(int j = 0; j < 10; j++){
          a[i*10+j] = 1;
       }
    }
    Ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class maClasse{
    public:
    void maFonction(QVector<int>);
     
    private:
    QVector<int> monQVector;
    };
    Appel de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFonction(monQVector);
    monQVector est remplit de 0 au début puis je cherche à le remplir de 1 dans maFonction. L'affichage du contenu du QVector avant et après l'appel de la fonction ne change pas. Il reste remplit à 0.

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

    Quels instructions utilises-tu pour l'affichage ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(int i = 0; i < 10; i++){
       for(int j = 0; j < 10; j++){
          std::cout << monQVector[i*10+j] << std::endl;
       }
    }
     
    maFonction(monQVector);
     
    for(int i = 0; i < 10; i++){
       for(int j = 0; j < 10; j++){
          std::cout << monQVector[i*10+j] << std::endl;
       }
    }

    Ici l'affichage me donne que des 0.
    Alors que si je le fais le même affichage dans maFonction il me donne bien des 1 et non des 0.

  6. #6
    Invité
    Invité(e)
    Par défaut
    ...
    j'observe que ta fonction ne peux pas, modifier, ton objet "a" conteneur ou tableau (déclaré avec la class qvector).
    Pour que ta fonction marche, il faudrait soit retouner l'objet conteneur "a" (ou le pointer),

    Voici ta fonction modifer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    QVector <int> maFonction()
    {  QVector<int> a ;
        a.resize(100) ;
    for(int i = 0; i < 10; i++){
       for(int j = 0; j < 10; j++){
          a[i*10+j] = 1;
       }
    }
    return a ;
    }
    Pour utiliser le contenu de ta fonction,il faudrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    QVector <int> monQVector ;
    monQVector.resize(100) ;
    (....)
    monQVector = maFonction() ; 
    (....)
    Voici un lien utilisable :

    http://qt.developpez.com/doc/4.7/qvector/#resize
    Dernière modification par Invité ; 07/04/2012 à 14h49. Motif: pour un oubli.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Je te remercie, ta solution fonctionne.
    Je trouve un peu bizarre qu'on ne puisse pas modifier directement le QVector en le passant en argument de fonction... dommage.

    Merci encore !

  8. #8
    Membre du Club Avatar de Buldor
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 40
    Points
    40
    Par défaut
    C'est possible mais le prototype de ta fonction est mauvais. Il faut lui donner un pointeur en argument pour que cela fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void maFonction(QVector<int>* a){
    for(int i = 0; i < 10; i++){
       for(int j = 0; j < 10; j++){
          a[i*10+j] = 1;
       }
    }
    ensuite pour l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFonction(&monQVector);
    Dans ton cas la fonction copie a en mémoire puis fait les modifs sur la copie. A la fin la copie est supprimé de la mémoire sans que a n'ait été modifié.

    Dans le cas de brother2007, la fonction fait de même mais à la fin elle retourne la copie en mémoire que tu peux ensuite assigner de nouveau à a.

    Dans le cas que je présente, la fonction ne fait pas de copie mais traite directement la variable à son adresse mémoire. (d'où le pointeur). l'ajout de l'esperluette lors de l'appel permet de retourner l'adresse mémoire de la variable.


    Je n'ai pas testé ma fonction mais elle devrait fonctionner pour ce que tu veux faire. Je te conseille d'étudier un peu l'utilisation des pointeurs en C/C++, ça devient rapidement incontournable.

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

Discussions similaires

  1. [XL-2010] Modifier application.calculation dans une fonction ?
    Par zanimox dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/10/2013, 15h17
  2. Modifier un argument dans une fonction
    Par hannibal.76 dans le forum Lisp
    Réponses: 0
    Dernier message: 15/11/2010, 15h08
  3. Modifier un Label dans une fonction Shared
    Par twixi dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/06/2008, 11h26
  4. Réponses: 1
    Dernier message: 28/12/2006, 17h02
  5. Réponses: 4
    Dernier message: 18/01/2006, 11h21

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