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 :

pointeurs identiques !


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Par défaut pointeurs identiques !
    Bonjour tout le monde.. j'ai un phénomène étrange dans mon code en C++. j 'ai deux opérateurs new successifs qui me créent la même adresse mémoire (en mode débug) :
    I=new int[n];
    J=new int[n];
    Je me retrouve avec I et J identiques. En plus le phénomène n'est pas systématique.
    Quelqu'un aurait-il une idée d'où ça peut venir !?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Par défaut
    Si 'n' a la même valeur pour les 2 opérateurs je trouverai ca normal

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Julien_C++
    Si 'n' a la même valeur pour les 2 opérateurs je trouverai ca normal
    pas moi, i et j sont supposés etre deux tableaux différents, meme s'ils doivent avoir la meme taille !!

  4. #4
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    bizard en effet

    Comment as tu procédé au test d'egalité des pointeurs I et J ?

    Quelle est la valeur de n à ce moment là ?

    ajoute le test suivant pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(I == J) {
      cout << "WARNING : I == J with n = " << n << " and adr = " << I << endl;
    }
    Est ce que le log apparait durant l'execution ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Par défaut
    J'ai dit une grosse bêtise

    Celà provient peut être de la variable n ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Par défaut
    Comment as tu procédé au test d'egalité des pointeurs I et J ?
    Quelle est la valeur de n à ce moment là ?
    ajoute le test suivant pour voir :
    J'ai vu que les 2 pointeurs étaient identiques dans le debuger VC++. Et ils étaient vraiment identiques car dans la suite du code, ils sont restés totalement les mêmes.
    Dans mon cas la valeur de n etait n=2 !
    C'est la première fois que je vois ça !!!

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Cela peut provenir de la valeur de n uniquement si elle est négative. Dans ce cas, le comportement de ton programme est indéfini. Cela peut aussi provenir de n'importe quel autre comportement indéfini ailleurs dans le programme, genre mauvaise désallocation ou accès à un élément inexistant d'un tableau. Les deux lignes que tu viens de montrer ne devraient pas à elles seules avoir un tel comportement.

  8. #8
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Tu ne peux pas ajouter les 3 lignes de code que j'ai citer ?
    Si le WARNING est logger dans la console, donne nous les éléments... ça pourait nous mettre sur une piste

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par superspag
    Tu ne peux pas ajouter les 3 lignes de code que j'ai citer ?
    Si le WARNING est logger dans la console, donne nous les éléments... ça pourait nous mettre sur une piste
    ou encore ecrire un

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Par défaut
    genre mauvaise désallocation ou accès à un élément inexistant d'un tableau
    Oui ça me semble plutôt un truc comme ça, mais je n'arrive pas à trouver d'où cela peut venir.
    Y-a-t-il des outils pour traquer les mauvaises allocations/désallocation mémoire ?
    un 'delete' au lieu d'un 'delete[]' pourrait-il avoir ce genre de conséquence ?
    ou est-ce qu'il y a plus de chance que ça provienne d'un truc du genre
    I[k]=p avec k>taille du tableau ?
    Tu ne peux pas ajouter les 3 lignes de code que j'ai citer
    Oui il me renvoie bien l'adresse et n!

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par marcus7
    Oui c'est bien ce que je pense, mais je n'arrive pas à trouver d'où cela peut venir.
    Y-a-t-il des outils pour traquer les mauvaises allocations/désallocation mémoire ?
    valgrind sous Linux, je ne sais pas sous Windows.

    Citation Envoyé par marcus7
    un 'delete' au lieu d'un 'delete[]' pourrait-il avoir ce genre de conséquence ?
    ou est-ce qu'il y a plus de chance que ça provienne d'un truc du genre
    I[k]=p avec k>taille du tableau ?
    Dans le deux cas, tu invoques un comportement indéfini, donc ça peut en être la cause.

    As-tu une raison précise pour utiliser des tableaux alloués manuellement au lieu de vector, valarray ou autre ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par roulious
    valgrind sous Linux, je ne sais pas sous Windows.
    http://www.codeproject.com/tools/visualleakdetector.asp
    En fait, c'est un bout de code que tu ajoutes a tes sources ; je ne l'ai pas encore utilisé personnellement, mais d'apres les échos, ca ne marche pas mal du tout.

  13. #13
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    As-tu une raison précise pour utiliser des tableaux alloués manuellement au lieu de vector, valarray ou autre ?
    +1

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Par défaut
    Heu non aucune raison , je sais c'est mal ...
    Je crois que la solution ça va être ça, remplacer mes int * = new int[] par des vector<int>.
    valgrind sous Linux, je ne sais pas sous Windows.
    je suis sous window, mais le tuyau m'interesse beaucoup, merci !

  15. #15
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    Heu j'ai pas tout suivi mais :

    A la base I et J c'est quoi ?
    Tu les déclare en fesant ce que tu fait actuellement ?
    Il ont la même valeur et la même adresse ?
    ou il pointent tout les deux vers la même adresse ?

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Par défaut
    I et J sont déclarés comme des int* et initialisés à NULL dans le constructeur de l'objet qui les possède. Mais la plupart du temps je n'ai aucun problème, mais dans certaine configuration de lancement de mon programme j'ai le problème I=J.

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par défaut
    dans certaine configuration de lancement de mon programme j'ai le problème I=J
    Peux-tu être plus clair sur la "configuration" ?

    Es-tu sûr de n'avoir mis nulle part I=J à la place de I==J ?

  18. #18
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    +1 à la dernière réponse de Boromir.
    M'est avis qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep -i 'i[[:space:]]*=[[:space:]]*j|j[[:space:]]*=[[:space:]]*i'
    va te renvoyer des lignes -- il faut dire que quand tu parles de tester i=j, cela accroit nos soupçons.

    Bref, sinon, il n'y a qu'une seule solution => exemple minimal mais complet qui permette de reproduire l'anomalie que tu observes.
    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. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57
  2. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  3. balises identiques
    Par Phmichel dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 28/10/2002, 09h18
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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