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 :

Programme C++ fonctionne sur Mac,PC mais pas Ubuntu?


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut Programme C++ fonctionne sur Mac,PC mais pas Ubuntu?
    Voila j'apprends le C++ depuis peu, j'ai écrit ce "petit" programme pour résoudre une grille de sudoku. Il fonctionne très bien sur mon Mac mini G4( compile avec g++ 4.01), et sur les pc de la fac sous windows (P4 sous XP compile avec visual studio), mais sur ces mêmes PC ,sous Ubuntu en compilant encore avec g++ (je sais plus la version) le programme ne donne pas le bon nombre de résultats et plante . Quelle erreur ai-je bien pu faire qui soit spécifique juste a un compilateur donné? ou bien est-ce les autres compilateurs qui sont plus laxistes?

    code en pièce jointe



    Edit Resolu : L'erreur venait de la fonction qui renvoyait une reference vers une case, Avec un pointeur à la place ça marche mieux.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Salut!

    L'erreur au plantage ainsi que la description des valeurs érronées nous aideraient à t'aider.

    En l'occurence ton programme ne compile pas chez moi.
    D'abord tu as mis des "using namespace std;" partout même là ou il n'y a pas d'espace de nom déclaré, aussi ça ne compile pas (Visual Studio 2008 -- vc9 )
    Va voir dans la faq a propos de using namespace, il ne faut pas l'utiliser comme tu l'as fait.

    J'ai aussi eu un problème bizarre de point d'entrée du programme non trouvé... j'ai forcé main dans le projet pour l'instant.

    Quand je lance le projet en debug ça crash avec une access violation, tu essais d'utiliser le tableau argv des paramettres de ligne de commande même si il est null...

    Il faudrait aussi que tu donnes les paramettres de test voir ton cas d'utilisation. Avec quel compilateur/version de VS avais-tu compilé ton projet? Est-ce que tu as les .sln et .proj pour tester plus efficacement?

    Sinon, de loin je dirais que le problème a plus de chance de venir des manipulations que tu fais dans ton code que d'un problème de configuration. Il se peut que tu n'ai pas vu les problèmes a l'execution sur les autres plateformes parceque tu as utilisé une vieille version de compilateurs? A vérifier.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Comme erreur à l'execution j'ai une erreur de segmentation, apparemment au moment de l'appel à la fonction grid::show(). Et j'ai l'impression que certaines affectations ne se font pas correctement. Cela UNIQUEMENT sur ubuntu.

    Effectivement les using namespace ne sont pas indispensables partout, j'en avais supprime certains pour la compilation sous windows. Ils ne genent pas gcc.

    parametres de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0 0 1 0 0 4 0 0 0 0 0 0 0 6 0 3 0 5 0 0 0 9 0 0 0 0 0 8 0 0 0 0 0 7 0 3 0 0 0 0 0 0 0 2 8 5 0 0 0 7 0 6 0 0 3 0 0 0 8 0 0 0 6 0 0 9 2 0 0 0 0 0 0 4 0 0 0 1 0 0 0
    on doit trouver 1 solution unique :
    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
     
    1
    calcul effectue en 1.52 secondes
    8875 branches parcourues
    1 solution(s) trouvee(s)
    solution numero 1
    +---+---+---+---+---+---+---+---+---+
    | 7 | 6 | 1 | 3 | 5 | 4 | 2 | 8 | 9 | 
    +---+---+---+---+---+---+---+---+---+
    | 2 | 9 | 8 | 1 | 6 | 7 | 3 | 4 | 5 | 
    +---+---+---+---+---+---+---+---+---+
    | 4 | 5 | 3 | 9 | 2 | 8 | 1 | 6 | 7 | 
    +---+---+---+---+---+---+---+---+---+
    | 8 | 1 | 2 | 6 | 4 | 9 | 7 | 5 | 3 | 
    +---+---+---+---+---+---+---+---+---+
    | 9 | 7 | 6 | 5 | 1 | 3 | 4 | 2 | 8 | 
    +---+---+---+---+---+---+---+---+---+
    | 5 | 3 | 4 | 8 | 7 | 2 | 6 | 9 | 1 | 
    +---+---+---+---+---+---+---+---+---+
    | 3 | 2 | 7 | 4 | 8 | 5 | 9 | 1 | 6 | 
    +---+---+---+---+---+---+---+---+---+
    | 1 | 8 | 9 | 2 | 3 | 6 | 5 | 7 | 4 | 
    +---+---+---+---+---+---+---+---+---+
    | 6 | 4 | 5 | 7 | 9 | 1 | 8 | 3 | 2 | 
    +---+---+---+---+---+---+---+---+---+
    pour l'histoire de tableau non-initialisé ça m'étonne, le programme est sensé quitter si le nombre d'arguments est trop faible pour renseigner toutes les valeurs ( premier if du main), ou alors c'est qu'il considere le return 0; comme une erreur... j'ai eu ce meme probleme a la fin du main et remplace par exit(0);

    pour les fichier spécifiques a windows et la version exacte de visual faudra atttendre jeudi que je retourne a la fac.

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Pour une raison que je n'ai pas eu le temps de déterminer le nombre d'argumetns était érroné (valeur aléatoire je présume) mais je regarderai en rentrant du boulot voir si yavait une raison particulière.

  5. #5
    Membre confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    Par défaut
    tu peux essayer de lancer le programme avec valgrind pour voir s'il détecte des fuites mémoire

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 704
    Points
    704
    Par défaut
    Bonjour,
    Citation Envoyé par isyldur Voir le message
    ou bien est-ce les autres compilateurs qui sont plus laxistes?
    Pour être habitué des programmes multiplateformes, oui les compilateurs ne sont pas tous aussi laxistes les uns que les autres et très souvent ils le sont de manières différentes...
    Après les systèmes fonctionnent aussi différemment. Pour ton cas, je n'ai pas testé le code, mais je parierais sur un problème mémoire, comme un dépassement de tableau par exemple... Mac OS & Windows peuvent gérer le dépassement sans planter mais dans un autre contexte, ce même dépassement va faire crasher l'application...

    Vérifie donc bien toutes tes allocations de mémoires, tes tableaux entre autre, et regarde bien qu'ils ne dépassent pas leurs tailles allouées...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Fabllot Voir le message
    Bonjour,

    Pour être habitué des programmes multiplateformes, oui les compilateurs ne sont pas tous aussi laxistes les uns que les autres et très souvent ils le sont de manières différentes...
    Après les systèmes fonctionnent aussi différemment. Pour ton cas, je n'ai pas testé le code, mais je parierais sur un problème mémoire, comme un dépassement de tableau par exemple... Mac OS & Windows peuvent gérer le dépassement sans planter mais dans un autre contexte, ce même dépassement va faire crasher l'application...

    Vérifie donc bien toutes tes allocations de mémoires, tes tableaux entre autre, et regarde bien qu'ils ne dépassent pas leurs tailles allouées...
    Je veux bien croire que je puisse avoir une erreur d'indice en lecture ou en écriture, pour ce qui est de l'allocation il n'y en a aucune de dynamique dans mon programme a part celle induites par le fonctionnement de la classe std::vector (qui stocke les résultats valides);

    Merci a tous pour vos réponses je vais voir si je trouve quelque chose avec les outils que vous m'avez suggérés.

    edit : pour valgrind c'est pas possible, version trop ancienne de mac os X.

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 704
    Points
    704
    Par défaut
    En regardant rapidement tes sources, je maintiens mon idée première de dépassement de tableau quelque part...

    Je ne remets pas en cause ton algorithme, mais tes calculs d'indices lors des accès à tes matrices sont assez complexes... Es-tu vraiment certain qu'à chacun des accès des indices sont compris entre 0 et 8 (inclus) ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Je me suis posé la question mais je suis a peu près sur que oui ( j'ai rajouté une parenthèse qui pouvait manquer).

    Par contre j'ai modifié la fonction Case& grid::Grille(int,int) pour qu'elle renvoie directement une Case et non une référence, et depuis je n'ai plus d'erreur de segmentation après un return dans le main.

  10. #10
    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
    Salut,
    Citation Envoyé par isyldur Voir le message
    Je me suis posé la question mais je suis a peu près sur que oui ( j'ai rajouté une parenthèse qui pouvait manquer).
    Une bonne façon de vérifier est de mettre un assert ou une trace juste avant pour être sur de tes indices.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Une bonne façon de vérifier est de mettre un assert ou une trace juste avant pour être sur de tes indices.
    Merci pour le conseil. J'ai rajouté les assert qui n'ont rien détecté en revanche ça m'a permis de voir un oubli de {} dans une boucle for imbriquée (grid::setchoice() ) , il n'y avait qu'une instruction a l'interieur mais je ne sais pas comment c'est sensé se comporter si on ne met pas les {}.

  12. #12
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Aïeyayaïe... J'espère sincèrement que tu as appris l'informatique tout seul... [edit] Là je me plaint de l'éducation hein ! C'est HS et pas contre toi >< !

    Le for, comme le if et toute les structures de contrôle, ça exécute ou saute l'instruction ou le bloc d'instruction immédiatement après.

    Les accolades, c'est pour marquer les blocs d'instructions.

    Un bloc d'instruction, je pense que tu trouvera ce que c'est dans les ressources si tu sais pas déjà.

    Pour résumer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i=0;i<10;++i)
        truc(i);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for(int i=0;i<10;++i) {
        truc(i);
    }
    on exactement le même effet.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    C'est bien ce que je pensais... mais c'est sans doute déconseillé d'écrire une instruction seule plutôt qu'un bloc, à cause des problemes de lisibilité et de risque d'erreur si on veut rajouter une instruction dans les if/for/while .

    donc si j'ai bien compris mon ancien code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i=3*(lastmodif/27);i<3*(lastmodif/27)+3;i++)
            {   for(j=3*((lastmodif%9)/3);j<3*((lastmodif%9)/3)+3;j++)
                        choix[i][j]=choice(i,j);
            }
    fonctionnait, de meme que le nouveau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(i=3*(lastmodif/27);i<3*(lastmodif/27)+3;i++)
            {   for(j=3*((lastmodif%9)/3);j<3*((lastmodif%9)/3)+3;j++)
                {   assert((i<9)&&(j<9)&&(i>=0)&&(j>=0));
                    choix[i][j]=choice(i,j);
                }
            }
    mais celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(i=3*(lastmodif/27);i<3*(lastmodif/27)+3;i++)
            {   for(j=3*((lastmodif%9)/3);j<3*((lastmodif%9)/3)+3;j++)
                assert((i<9)&&(j<9)&&(i>=0)&&(j>=0));
                choix[i][j]=choice(i,j);
     
            }
    aurait été incorrect




    Citation Envoyé par Lavock Voir le message
    Oui enfin, du code bien indenté, c'est pas grave. Au contraire, ça fais toujours des {} en moins. Le coup du "ça peut être génant si", on pourrais aussi faire des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (true) { instruc(); }
    A chaque ligne... Après tout, sinon ça pourrait être gênant si je veux mettre une condition là plus tard >< !
    lol, ouais mais le fait d'ajouter des {} n'a pas d'effet après compilation alors que rajouter un if(true) c'est une operation en plus.

  14. #14
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Oui enfin, du code bien indenté, c'est pas grave. Au contraire, ça fais toujours des {} en moins. Le coup du "ça peut être génant si", on pourrais aussi faire des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (true) { instruc(); }
    A chaque ligne... Après tout, sinon ça pourrait être gênant si je veux mettre une condition là plus tard >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  15. #15
    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 isyldur Voir le message
    lol, ouais mais le fait d'ajouter des {} n'a pas d'effet après compilation alors que rajouter un if(true) c'est une operation en plus.
    C'est complètement HS par rapport à ton topic, mais je suis prêt à parier ma chemise que le compilateur optimise cette ligne (en release) et que ça ne génère pas la comparaison.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Je pense que mon erreur venait de la fonction grid::Grille, le fait de renvoyer une référence vers une Case devait ne pas plaire, ça passe mieux avec un pointeur.
    Sinon j'ai modifie le programme pour qu'il puisse prendre un fichier en argument après l'option 'f'.

    sudoku f sodokuvalue.txt doit donner une solution unique en quelques secondes

    j'ai également mis le source pour la variante brute force de mon programme.(plus performant sur les problemes faciles, mais plus lent sur les difficiles comme celui dans sudokuvalue.txt)


    Si quelqu'un de courageux veut bien tester si ca marche sur linux et me confirmer que je peux mettre le tag [resolu]? moi j'ai pas d'acces a linux juqu'a lundi dans 2 semaines.

  17. #17
    Membre averti Avatar de ZeRevo
    Inscrit en
    Avril 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 302
    Points : 342
    Points
    342
    Par défaut
    Installes une machine virtuelle. Virtualbox est très user friendly ça sera rapide

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par ZeRevo Voir le message
    Installes une machine virtuelle. Virtualbox est très user friendly ça sera rapide
    Effectivement ça aurait pu etre une idee tout a fait valide... si j'avais eu un processeur Intel

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

Discussions similaires

  1. Fonctionne sur l’émulateur mais pas sur tablette
    Par devbot dans le forum Android
    Réponses: 2
    Dernier message: 04/12/2011, 20h53
  2. Réponses: 0
    Dernier message: 24/06/2010, 15h10
  3. Réponses: 1
    Dernier message: 11/11/2009, 12h35
  4. Réponses: 0
    Dernier message: 03/04/2008, 15h14
  5. Programme VB6 fonctionne en XP SP1, mais pas en SP2
    Par domb_st dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 11/08/2006, 21h16

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