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 :

tableau const, mais modifié ?!


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut tableau const, mais modifié ?!
    Bonjour,
    Je me suis remis récemment au C++, et j'ai quelques soucis avec le passage en argument des tableaux.

    Pour résumer je code un classe Matrice, qui effectue un stockage creux, et j'ai un problème dans la fonction membre qui effectue le produit de cette matrice par un vecteur (tableau de double).

    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
    void  MATRICE::mult(const double  * xx, double * vv)
    {
    	int ii,j;
    	double valx;
     
    	/*for(ii=0;ii<10;ii++)
    	{
    	cout<<xx[ii]<<" ";
    	}
    	cout<<endl;*/
     
    	for(j=0 ; j<n ; j++,vv++) *vv=0;
     
    	for(j=0;j<n;j++)
    	{
    		valx = xx[j];
    		for(ii=tableau_p[j]; ii<tableau_p[j+1];ii++)
    		{
    		vv[tableau_i[ii]]+= valx  *  tableau_valeur[ii];
    		}
    	}
    	/*
    	for(ii=0;ii<10;ii++)
    	{
    	cout<<xx[ii]<<" ";
    	}*/
     
     
    }

    Le problème est que mon tableau xx est modifié entre les deux affichages (qui sont commentés ici). Je ne vois pas trop pourquoi...

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 711
    Points
    6 711
    Par défaut
    il suffit que vv pointe dans xx, soit avant l'appel, soit plus probablement à cause de l'incrémentation de vv lors de la mise à zéro qui semble louche et qui provoque un débordement dans la suite de la fonction (il aurait fallut écrire vv[j] = 0 et laisser vv inchangé, ou remplacer la boucle par un memset)
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci, en fait j'avais mal alloué les tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vv = new double(n);
     
    au lieu de 
     
    vv= new double[n];

    Je ne comprend d'ailleurs pas pourquoi le code compilait..

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 711
    Points
    6 711
    Par défaut
    le code compilait parce que vv = new double(n) est tout à faut légal, c'est l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vv = new double;
    *vv = n;
    vous êtes sure que la modification de vv via le premier for est correcte ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    et bon, std::vector et ces problemes disparaissent ...

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Joel F Voir le message
    et bon, std::vector et ces problemes disparaissent ...
    +++++++

    Citation Envoyé par LB_99 Voir le message
    Le problème est que mon tableau xx est modifié entre les deux affichages (qui sont commentés ici). Je ne vois pas trop pourquoi...
    Ecrasement du à un problème d'indice a été ma première idée. Du coup, j'ai lu ton code et là :
    Citation Envoyé par LB_99 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	for(j=0 ; j<n ; j++,vv++) *vv=0;
     
    	for(j=0;j<n;j++)
    	{
    		valx = xx[j];
    		for(ii=tableau_p[j]; ii<tableau_p[j+1];ii++)
    		{
    		    vv[tableau_i[ii]]+= valx  *  tableau_valeur[ii];
    		}
    	}
    Comme le dit bruno, tu as modifié ton pointeur (pas la valeur pointée, mais l'adresse) de vv. Si n est la taille allouée pour vv, alors le pointeur désigne la fin de la zone mémoire valide et va commencer à jardiner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	for(j=0 ; j<n ; j++) vv[j]=0.;
     
    	for(j=0;j<n;j++)
    	{
    		valx = xx[j];
    		for(ii=tableau_p[j]; ii<tableau_p[j+1];ii++)
    		{
    		    vv[tableau_i[ii]]+= valx  *  tableau_valeur[ii];
    		}
    	}
    Note que const peut aussi s'utiliser sur l'adresse d'un pointeur et non sur la valeur pointée. Tu peux alors surveiller que tu ne changes pas cette adresse dans ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void  fonction(double const  * const xx, double * const vv)
    Enfin, pour mettre au point, je mettrai des assert sur les indices pour détecter ces erreurs.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/08/2009, 21h15
  2. Réponses: 1
    Dernier message: 14/05/2008, 22h28
  3. tableau croisé .. mais pas dynamique
    Par didier.cabale dans le forum Excel
    Réponses: 1
    Dernier message: 23/01/2008, 12h00
  4. Réponses: 2
    Dernier message: 04/06/2007, 11h31
  5. savoir quels champs d'un tableau ont été modifiés
    Par pek dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/03/2005, 15h26

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