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 de gestion de mémoire (segfault)


Sujet :

C

  1. #1
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut Problème de gestion de mémoire (segfault)
    bonjour,
    j'ai un programme à développer (équivalent à puissance 4) et j'ai un problème avec la gestion de mémoire à priori.

    j'ai un tableau de 10 lignes et 15 colonnes dont tous les éléments sont égaux à 0. quand le joueur 1 joue dans une colonne, ça place le pion le plus bas possible et ça met 1 à l'endroit correspondant dans le tableau. tout cela fonctionne à merveille quand je suis dans un mode humain contre humain.

    je dois ajouter une ia (basique) à mon programme. l'ia semble fonctionner correctement. cependant, dès que je veux mettre un pion dans la colonne 10, ça provoque un segfault. si je mène l'ia à placer dans la colonne 10, elle ne le fait pas et place son pion ailleurs. avec gdb, j'ai réussi à savoir à peu près d'où ça vient
    Program received signal SIGSEGV, Segmentation fault.
    0x08048c56 in iaJoue (joueurN=1, myGrid=0xbff3cef4, peutJouerDansLigne=0x0) at puiss.h:473
    473 if(peutJouerDansLigne[j] == -1)
    le problème est l'adresse de peutJouerDansLigne (0x0 !). c'est un tableau à une dimension

    je ne vois pas du tout pourquoi ça pose problème sur la colonne 10 et uniquement sur celle-ci : toutes les autres fonctionnent sans souci. j'ai mis mon source en pièce jointe pour que vous puissiez regarder l'intégralité du code

    pourriez-vous m'aider ?


    ps :
    Citation Envoyé par gcc -v
    gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord

    UNE HORREUR ABSOLUE ..............


    Mettre du code C dans un fichier include .................


    Corrige tout ça et on t'aidera après...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    la pièce jointe est corrigée

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    bon autre remarque (je sais pas ce qu'il y a , mais c'est la 2ième fois déjà aujourdhui..)

    tu fais tes tests à l'envers, quand tu veux contrôler si tu ne dépasses pas les bornes....


    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int verifLigne(Grille myGrid, int row, int col, int joueurN)
     
    .....
     
    	    if(myGrid[row][col+i] == joueurN && col+i < COLONNE && col+i >= 0)

    tu COMMENCES par accèder à myGrid..[col+i] AVANT de tester si col+i est positif et inférieur à la dimension..

    Et c'est vrai pour au moins les 4 routines de vérification....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Corriges déjà ces 2 warnings :

    Project : Console application
    Compiler : GNU GCC Compiler (called directly)
    Directory : D:\Temp\increment3\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: puiss.c
    puiss.c: In function `iaJoue':
    puiss.c:455: warning: 'colonneAJouer' might be used uninitialized in this function
    puiss.c: In function `joueurNJoue':
    puiss.c:502: warning: 'row' might be used uninitialized in this function
    Linking console executable: D:\Temp\increment3\console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 2 warnings
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  6. #6
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    alors j'ai corrigé tout l'ordre des tests et initialisé les variables non initialisées. c'est bizarre d'ailleurs parce que gcc ne me dit rien là-dessus malgré le -Wall


    j'arrive à éviter le segmentation fault en supprimant les lignes 452, 457 à 459 et en changeant myGrid2 en myGrid sur la ligne 466 de puiss.c.
    maintenant, j'ai un autre problème plus tordu dans un cas sans bug, si je joue en colonne 8 puis 9, je devrais avoir mes pions en bas de ces deux colonnes mais ça ne se passe pas comme ça si je joue en 8, mon pion est bien placé puis si je joue en 9, mon nouveau pion est bien placé mais celui en colonne 8 a disparu ! on dirait qu'il se "mélange les pinceaux" étant donné que la ligne tout en bas est la numéro 9 même si ça n'a aucun sens ça ne le fait que pour ces colonnes, tout le reste fonctionne correctement.
    avez-vous une idée ?


    edit : quand je mets la profondeur de recherche à 1 (puiss.c:466 : changer le premier argument de 2 en 1), ça ne bug plus : mon problème viendrait donc de ma récursivité qui ne serait pas correcte

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Michaël
    j'ai un programme à développer (équivalent à puissance 4) et j'ai un problème avec la gestion de mémoire à priori.

    <...>
    J'ai récupéré la dernière version (24 Mai à 22h11) et j'obtiens, avec

    http://emmanuel-delahaye.developpez....tm#cfg_compilo
    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
     
    Project   : Puissance 4
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\puissance4\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: puiss.c
    In file included from puiss.c:13:
    puiss.h:27: warning: function declaration isn't a prototype
    puiss.c:75: warning: function declaration isn't a prototype
    puiss.c: In function `choixAleaJoueur':
    puiss.c:78: warning: will never be executed
    puiss.c: In function `iaJoue':
    puiss.c:455: warning: 'colonneAJouer' might be used uninitialized in this function
    puiss.c: In function `joueurNJoue':
    puiss.c:502: warning: 'row' might be used uninitialized in this function
    Compiling: main.c
    In file included from main.c:14:
    puiss.h:27: warning: function declaration isn't a prototype
    main.c:23: warning: function declaration isn't a prototype
    Linking console executable: C:\dev\puissance4\console.exe
    Process terminated with status 0 (0 minutes, 3 seconds)
    0 errors, 7 warnings
    Il y a encore de la mise au point à faire avant de lancer l'exécution...
    • Ne pas utiliser le _ en préfixe d'identificateurs (usage réservé)
    • Les commentaires // n'existent pas en C90
    • Le code et le commentaires ne devraient pas dépasser 80 colonnes.
    • Lorsqu'une fonction n'a pas de paramètres, on le précis avec void.
    • Dans choixAleaJoueur(), il y a 2 'return' à la suite, c'est un de trop.
    • L'initialisation du générateur pseudo doit être fait une seule fois.
    • Dans iaJoue(), la variable colonneAJouer pourrait ne pas êre initialisée. Lui donner une valeur par défaut (-1, par exemple) pour détecter un éventuelle erreur.
    • Dans joueurNJoue(), row pourrait ne pas être initialisé. Même punition...

    Malgré ces mises au points, crash après que la machine ait tenté de répondre à mon jeu.

    Il doit y avoir un problème de débordements. Je conseille une instrumentation à coup de assert()...

    Et voilà : 1 er essai :

    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
     
    Initialisation de la grille...
    Affichage de la grille initialisÚe :
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    C'est au joueur 2 de commencer !
    Joueur 2, o¨ voulez vous jouer le pion ? 3
    Assertion failed: row + 1 < LIGNE, file puiss.c, line 202
     
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
     
    Press ENTER to continue.
    Déjà, ceci devrait améliorer...

    http://www.developpez.net/forums/sho...68&postcount=4
    Fichiers attachés Fichiers attachés
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    j'ai réussi à trouver d'où vient le problème pour mon histoire de colonne

    dans la fonction ia, j'ai inversé colonne et ligne. donc il faut simplement changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    grilleDuJeu[colonneJouee][l] = joueur;
    ....
    grilleDuJeu[colonneJouee][l] = 0;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    grilleDuJeu[l][colonneJouee] = joueur;
    ....
    grilleDuJeu[l][colonneJouee] = 0;
    et plus de bug

    pour info, gcc 4.1 ne supporte pas -Wuninitialized l'optimisation n'est pas activée. il suffit d'ajouter un -O2 par exemple


    à vous tous

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

Discussions similaires

  1. Problème de gestion de mémoire
    Par BernardBouree dans le forum VB.NET
    Réponses: 2
    Dernier message: 12/06/2015, 18h18
  2. Problème de gestion de mémoire ?
    Par sana_d dans le forum Langage
    Réponses: 4
    Dernier message: 08/03/2013, 23h17
  3. [Tomcat] Problème de gestion de mémoire
    Par tvcinq dans le forum Eclipse
    Réponses: 0
    Dernier message: 31/12/2009, 09h45
  4. Problème de gestion de mémoire - grosses matrices
    Par julesu dans le forum Fortran
    Réponses: 9
    Dernier message: 26/05/2008, 11h04
  5. Problème de gestion de mémoire
    Par Baud10 dans le forum MFC
    Réponses: 6
    Dernier message: 04/01/2008, 10h49

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