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 :

Différence de résultat entre x86 et x64


Sujet :

C++

  1. #41
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Au regard de ce qu'avance Medinoc, ton problème est certainement plus grave que ta focalisation sur ces sorties...
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  2. #42
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Au regard de ce qu'avance Medinoc, ton problème est certainement plus grave que ta focalisation sur ces sorties...
    c'est quoi ce problème? ce qui m’intéresse c'est le résultat final car c'est là que je vois la différence
    Je suis pas experte c'est pourquoi je cherche l'aide

    Citation Envoyé par dragonjoker59 Voir le message
    C'est quand même étrange que tu aies des différences de résultat entre debug et release, en 32 bits, ça pue, ça.
    Tu n'aurais pas des différences d'options de compilation, entre les 2 modes?
    oui tu as raison, c'est le modèle de virgule flottante qui est différent

  3. #43
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    c'est quoi ce problème? ce qui m’intéresse c'est le résultat final car c'est là que je vois la différence
    Sauf que avoir un résultat juste, avec un code, disons, mal écrit, cela s'appelle de la chance (et moi, j'appelle ça aussi, bâclé son travail et faire un truc qui ne sera pas du tout utilisable dans le futur, donc du gâchis).
    Après, c'est à vous de voir.

    Lorsque je vois des différences, rien que sur cette ligne (ou même la première) :
    radius 0.0285115
    J'ai peur.
    Donc, vous reprenez de l'itération une (sans même en faire 60), et vous voyez si les résultat son identique. Ensuite, vous utilisez soit un débogueur, soit des printf/cout et vous déboguez pour voir où cela diverge.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #44
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    j'avoue je suis pas experte et je demande votre aide: je ne trouve pas exactement l'erreur
    Bien sure je veux corriger mon code (notamment bien écrire mon programme) et par conséquent j'aurai le bon résultat
    Si j'insiste sur le bon résultat c'est que j'insiste à corriger l'erreur et donc je me suis redirigée vers vous
    Merci

  5. #45
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Déjà, avant de faire les Nosferatu entre 32bits et 64bits, commences par avoir les mêmes résultats en Debug et en Release (et un code fiable, ça mange pas de pain).

  6. #46
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Bonjour,
    je vous remercie pour vos réponces, mis jusqu'à maintenant vous ne m'avez donné aucune piste pour modifier ou corriger mon code, d'où je dois commencer, qu'est ce que je dois faire ...


  7. #47
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai donné une piste: Plus de rigueur dans les classes utilitaires, si tu tiens à utiliser des classes 1-indexées. Éviter d'exposer publiquement des méthodes que tu n'utilises pas depuis l'extérieur. Plus de vérifications (des assertions par exemple)...

    Et bien sûr, faire tes tests en /fp:strict dans tous les cas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #48
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    J'ai regardé très rapidement ton code, et déjà une chose m'a interpellé, c'est ta fonction getElement dans GMatrix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inline const double& getElement (  int lineIndex,   int columnIndex) const{
    	return _dataMatrix[(lineIndex-1)*_nbColumns + (columnIndex-1)];
    }
    Très étrange de mettre les index moins 1, donc je me suis dit c'est qu'il y a de fortes chances que tu commences tes a indices a 1 dans tes parcours, et en effet c'est bien le cas, dans toutes les utilisations de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 1; i<=_nbColumns; i++)
         res(i) = this->getElement(lineIndex,i);
    Cependant, quand tu alloue _dataMatrix dans allocGMatrix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _dataMatrix = new double[_nbLines*_nbColumns];
    	for (  int i = 0; i < _nbLines; ++i)
    		for (  int j = 0; j < _nbColumns; j++)
    			_dataMatrix[i*_nbColumns+j] = 0;
    Les indices sont à 0. Ton code fait tout simplement un buffer overflow, vu qu'à un moment tu vas écrire une case plus loin que la taille du tableau alloué.

    Typiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double * d = new double[2];
    d[2] = M_PI;
    Est le genre de choses qu'il ne faut pas du tout faire.

    Donc voilà pas très étonnant tes résultats différents.

    Ce que je te préconise de faire :
    - est de remplacer ton pointeur de double dans ta classe (_dataMatrix), et d'utiliser un std::vector, vu que tu codes sous Visual 2012, en débug, il t'aurait lancer une exception sur le dépassement de ton tableau avec l'utilisation de l'opérateur [] (pas en release cependant, cela n'est fait qu'avec la fonction at()).
    -de commencer toutes tes boucles à l'indice 0 au lieu de 1, ce qui fait qu'il faut que tu changes ta fonction getElement en conséquences.
    -vu que tu as fais le choix de travailler sur une dimension (ce qui est très bien), il faut que tu gardes à l'esprit que ta fonction getElement fait un parcours en row major dans l'état actuel des choses, donc il faut que tes parcours prennent bien en compte ce fait afin de ne pas avoir de surprise.

    Je te laisse lire ce lien sur le Major Order

  9. #49
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Merci Danny-k et Médinoc, je vais remplacer tout en vecteur et je re vers vous
    Médinoc, il y a des fonctions publics car elles sont utilisées dans d'autres codes

  10. #50
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Problème résolu,
    Merci à vous tous,
    Et un très grand merci à Danny-k

    le fait de remettre tous les indices à 0 a résolu mon probleme
    Merci encore une fois

  11. #51
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Bonjour,
    Je suis de retour, j'ai cru que mon probleme est résolu mais j'avais tord,
    J'ai utilisé std::vector au lieu de double * dans mes Gmatrix et Gvector, j'obtient le même résultat en release et en debug mais pas en 32 et 64 bits.
    la modification de l'option strict et précise ne change pas le résultat
    Avez vous une idée sur ce qui ce passe svp?

  12. #52
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Avez vous une idée sur ce qui ce passe svp?
    Fournis un code minimal qui reproduit le problème.

  13. #53
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Fournis un code minimal qui reproduit le problème.
    Compute - Vector.zip

    NB: J'ai modifié que les index des fonctions utilisées dans les calculs
    Merci

  14. #54
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Dans ta première version, tu avais fait le choix d'utiliser un tableau à une dimension
    Et là tu fais le choix d'utiliser un tableau à 2 dimensions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<double>> _dataMatrix
    C'est dommage, tu n'avais juste qu'à remplacer ton pointeur par un vecteur sans rien changer.

    Soit dit en passant le problème n'est pas là et je vois que tu n'as pas suivi complètement mes conseils, puisque tu continue toujours à commencer tes indices à 1 dans GMatrix et GVector. En gros partout où tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i = 1; i <= size; ++i)
    change par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i = 0; i < size; ++i)
    Ta fonction getElement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inline double& getElement (  int lineIndex,   int columnIndex){
    		return _dataMatrix[(lineIndex-1)][(columnIndex-1)];
    	}
    Doit devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inline double& getElement (  int lineIndex,   int columnIndex){
    		return _dataMatrix[lineIndex][columnIndex];
    	}
    Idem pour setElement.

    De plus passe tes paramètres de types primitifs, par valeur plutôt que const reference :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void setElement (int lineIndex, int columnIndex, double value);
    Ensuite, la fonction allocGMatrix, n'a pas grande utilité, tu peux déplacer le corps de cette fonction directement dans le constructeur et l'opérateur d'affectation, et initialiser ton vector par liste d'initialisation dans le constructeur paramétré, ça sera plus performant. Rien ne sert de clear dans le constructeur, vu que le vector par défaut à une taille de 0.

    Le problème persiste, car dans cette fonction tu construit un vector avec _nbLines et _nbColumns, mais tu parcours jusqu'à _nbLines et _nbColumns compris, d'où les problèmes persistant.

    Là j'ai parlé uniquement que de GMatrix, mais c'est la même chose dans GVector, l'idée quand on développe une bibliothèque matricielle, avant de passer aux opérations avancées, telles que l'inversion, multiplication, etc. C'est d'abord de tester l'intégrité de ses valeurs, sur un jeu de données assez petit, tester les bornes (typiquement là les buffer overflow), et de tester les fonctions élementaires comme les accès (tes fonctions getElement et setElement ; qui soi dit-en passant gagnerait peut-être en lisibilité avec une surcharge de l'opérateur() plutôt que d'être autant verbeux avec des fonctions get et set.)

  15. #55
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Merci Dannu-k pour votre réponse,
    Citation Envoyé par Danny-k Voir le message
    Le problème persiste, car dans cette fonction tu construit un vector avec _nbLines et _nbColumns, mais tu parcours jusqu'à _nbLines et _nbColumns compris, d'où les problèmes persistant.
    J'ai noté que je n'ai pas modifié tout le code, j'ai modifié juste les fonctions et les opérateurs utilisés dans compute, concernant les indices qui commencent par 1 c'est parce que il y a un -1 dans set et get donc ça devient 0, sinon le vector aurait lever une assertion failed,
    donc normalement il y aura pas de problème de commencer par 1 et faire un -1, ça revient au même de commencé par 0, et _nbLines, _nbColumns ne sont pas atteint, sinn avec vector il aura l'exception

  16. #56
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Ben oui, mais si tu ne corriges pas le problème partout où il apparait, ça ne peut pas aller non plus...
    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).

  17. #57
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Ben oui, mais si tu ne corriges pas le problème partout où il apparait, ça ne peut pas aller non plus...
    Si je l'ai corrigé là où il faut, si tu exécute tu peux remarquer qu'il n'y a pas de bug.

  18. #58
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Le problème c'est qu'il n'y a absolument aucune homogénéité dans ton code, à certains endroits, tu utilises des indices commençant a 0, et d'autres à 1.
    Ce n'est pas parceque visual ne lève pas une exception que tu prends la bonne valeur.

    Ce que je te conseillerais c'est de refactorer ton code pour n'avoir que des indices à 0 partout, tu peux penser que c'est une perte de temps, mais au final tu auras un code homogène plus facilement debuggable, de plus c'est une norme en informatique de toujours commencer a 0, je ne connais aucune bibliothèque matricielle digne de ce nom qui travaille sur des indices commençant à 1.

  19. #59
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Je connais juste Matlab qui commence à 1 pour ses matrices (et VBA qui permet de choisir), et c'est vraiment casse bonbons
    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.

  20. #60
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    En LUA les indices commencent à 1 aussi par convention. (même s'il est possible de faire à peu près n'importe quoi et continuer à utiliser le 0 par défaut, mais ça te prive de fonctions de base de parcours etc de mémoire)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/07/2010, 10h27
  2. [AC-2000] Différence de résultat entre acpreview et Print d'un état
    Par riri2938 dans le forum IHM
    Réponses: 0
    Dernier message: 20/02/2010, 15h50
  3. [Débutant] Différences de résultats entre MATLAB 6.5 et 7.8
    Par Caps59 dans le forum MATLAB
    Réponses: 21
    Dernier message: 16/03/2009, 15h04
  4. Différence de résultat entre MATLAB et Scilab
    Par ABN84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/05/2008, 22h53
  5. Différence de résultats entre requêtes SQL et Criteria
    Par titoudemtl dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/08/2006, 09h30

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