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 :

problème d'écrasement mémoire ?


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut problème d'écrasement mémoire ?
    Bonjour, je développe un code avec Visual 2005 et j'ai un problème que je n'ai encore jamais rencontré.

    Voici mon code qui pose souci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	for(int i = ibegin ; i < iend ; i += step)
    	{
    		_def.push_back(lambda[i]);
    		_sigma.push_back(sigma[i]);
    		_t.push_back(temps[i]);
    		_T.push_back(Tcarac);
    		_V.push_back(vitesse_moy);
    	}
    _def, _sigma, _t, _T, _V, lambda, sigma, temps sont des std::vector<double>, Tcarac et vitesse_moy sont des doubles

    Le problème est le suivant : au début, _def, _sigma, _t, _T et _V sont vides. J'arrive dans ma boucle for(). Au moment où je suis à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _t.push_back(temps[i]);
    _t se remplit de la valeur temps[i] (donc c'est normal) mais _T aussi !

    si je mets la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _t.push_back(temps[i]);
    en commentaire, _T ne se remplit pas de la valeur Tcarac (donc _T est toujours vide)

    si je renomme _T en _TT (par exemple), le problème disparaît (_t se remplit de la valeur temps[i] et _TT de la valeur Tcarac : bref le comportement est normal).

    Quelqu'un aurait-il une idée ?

    Merci d'avance

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par salseropom Voir le message

    Quelqu'un aurait-il une idée ?
    Regarder la sortie du preprocesseur? _T et _V sont des noms reserves dans tous les contextes, _def, _sigma, _t dans certains, ca ne m'etonnerais pas qu'un entete les utilise pour un objectif rentrant en conflit avec toi.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    ok, j'ai renommé ma variable _t par _tps et le problème a disparu. Je devais bien avoir un conflit de variable.

    Ceci dit, que je renomme _t en _tps ou _T en _TT, le problème a disparu. Je trouve que c'est bizarre...

  4. #4
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Les noms commençant par _ et __ sont réservé pour les compilateurs / STL. A ne pas utiliser sous peine de comportements étranges (et dépendant du compilateur).

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par zul Voir le message
    Les noms commençant par _ et __ sont réservé pour les compilateurs / STL. A ne pas utiliser sous peine de comportements étranges (et dépendant du compilateur).
    Aïe, dans tous mes programmes, tous les attributs de mes classes commençent par un underscore... Ca me servira de leçon...

    En gros, pour reconnaître une variable si elle est un attribut de ma classe ou non, le mieux est donc de la faire terminer par un underscore (et non de la faire commencer).

    Comment faites-vous pour différencier un attribut d'une classe d'une "simple" variable ? Quelle convention utilisez-vous ?

    Merci

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    La convention que j'utilise :
    membre de classe : m_typeNomVariable
    variable globale : g_typeNomVariable
    variable locale : l_typeNomVariable
    paramètre de fonction : p_typeNomVariable

    exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::string m_strNom;
    int g_iProgramID;
    double l_dPrecision;
    const std::string & p_strNouveauNom
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par zul Voir le message
    Les noms commençant par _ et __ sont réservé pour les compilateurs / STL. A ne pas utiliser sous peine de comportements étranges (et dépendant du compilateur).
    Les noms contenant un double underscore (pas uniquement au debut) sont reserves dans tous les contextes.

    Les regles sont un peu plus complexes pour les noms commencant par un seul underscore. La seule exception que je retiens c'est que comme nom de membre ca passe si le caractere qui suit est une minuscule, parce que c'est une convention commune -- meme si je ne l'applique pas.

    Citation Envoyé par salseropom Voir le message
    Aïe, dans tous mes programmes, tous les attributs de mes classes commençent par un underscore... Ca me servira de leçon...
    Voir ci-dessus.

    En gros, pour reconnaître une variable si elle est un attribut de ma classe ou non, le mieux est donc de la faire terminer par un underscore (et non de la faire commencer).
    C'est une autre convention.

    Comment faites-vous pour différencier un attribut d'une classe d'une "simple" variable ? Quelle convention utilisez-vous ?
    Quelques conventions que j'ai vues:
    - _ en prefixe
    - _ en suffixe
    - my/our en prefixe (permet en plus de differentier statique ou pas)
    - m_ en prefixe
    - pas de marquage particulier, les noms locaux sont declares suffisemment pres, les autres noms sont marques.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Personnellement, j'ai vu tout ce qu'à indiqué Jean-Marc (plus du g_ pour les globales), y compris mélangé à diverses autres variante (notation hongroise ou assimilée).

    J'ai tendance à préférer les myXxxxx, qui présentent un avantage : Le nom de variable se prononce aisément à voix haute quand on discute du conde entre collègues.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    J'ai tendance à préférer les myXxxxx, qui présentent un avantage : Le nom de variable se prononce aisément à voix haute quand on discute du conde entre collègues.
    C'est ce que j'utilise dans mes projets perso.

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il y a, à vrai dire, à peu près autant de conventions de nommage que de programmeurs / d'équipe de développement

    Mon avis est qu'il y a effectivement des conventions plus intéressantes que d'autres, mais que ce qui importe surtout, c'est de la suivre (au moins au niveau du projet) une fois qu'elle a été définie.

    Parce qu'il faut avouer que, si tu passe sans cesse d'une notation à l'autre au sein d'un seul et même projet, cela deviendra rapidement le bordel intégral.

    Pour le reste, il faut avouer que l'argument sur la facilité de prononciation de Loic se tient, mais que, bien souvent, le seul fait de déclarer les noms locaux suffisamment près de leur lieu d'utilisation devrait déjà permettre d'éviter toute confusion

    De plus, la convention de nommage des variables dépend également grandement de celle utilisée pour les noms de fonctions!

    A titre d'exemple, je préfères personnellement avoir un accesseur nommé name() plutôt qu'un accesseur nommé getName(), même si je n'imposerai jamais cette vision des choses à quiconque (du moins, en dehors des cas où le choix est de ma responsabilité).

    Le résultat immédiat de cette préférence est qu'il faudra bien trouver un moyen de faire la distinction entre l'accesseur et le membre qu'il est sensé renvoyé

    Ma "fainéantise naturelle" me pousse à utiliser l'underscore en postfixe, mais, encore une fois, ce n'est qu'une préférence personnelle

    Tout cela pour dire que les conventions de nommages méritent un débat global (qui prendra l'ensemble des aspects en compte) et général (auquel participeront l'ensemble des développeurs d'une équipe), mais qu'il sera particulièrement difficile de faire ressortir des règles générales aussi bien sur un forum que dans une réunion qui serait dédiée au sujet
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. problème d'écrasement mémoire
    Par salseropom dans le forum C
    Réponses: 14
    Dernier message: 31/07/2008, 14h52
  2. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07
  3. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29
  4. Réponses: 25
    Dernier message: 16/07/2003, 20h41
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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