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

Langage Delphi Discussion :

EAccess violation a la fermeture de l'application


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut EAccess violation a la fermeture de l'application
    Bonjour à tous,
    je demande votre aide car je ne parviens pas à régler un problème.
    Lors de la fermeture de mon programme (un jeu d'anagramme), je recois l'erreur suivante :

    Exception EaccessViolation dans le module projet1.exe dans 00000000
    Violation d'accès à l'adresse 00000000. Lecture de l'adresse 00000000.


    J'utilise des pointeurs dans mon code, j'ai déja essayé de mettre des dispose() etc mais rien n'y fait.

    Que représentent les adresses mémoires ci-dessus ?

    Merci pour votre aide.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Ces adresses ne représentent rien en particulier. Pour essayer de résoudre ce problème il faut que vous regardiez les destructeurs de vos différents objets pour voir si vous ne tenteriez pas de détruire un objet déjà détruit.

    Par ailleurs vous avez mentionné l'utilisation de pointeurs (avec des records j'imagine), ce n'est pas très aisé de résoudre ce genre de problème comme ça sans infos, peut-être serait-il bon de poster quelques extraits de code pertinents pour que l'on puisse regarder.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    Bonjour, merci de votre réponse.
    Je poste ci-dessous un extrait de code.
    C'est après l'execution de cette procédure et ensuite la fermeture du programme que l'erreur se produit. Elle n'apparati pas pendant l'execution de la procedure.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    procedure placeMots(motTrie,vraiMot:string;indice:integer;tab:Ttab);
     
      var i,cour,nv,nvMot:Pliste;
     
     
    begin
    //Creation de la cellule contenant le mot trié.
    nv:=new(PListe);
    nv^.mot:=motTrie;
    nv^.trieSvt:=NIL;
    nv^.MotSvt:=NIL;
    nv^.first:=true;
     
    //Creation de la cellule contenant le mot non trié.
    nvMot:=new(PListe);
    nvMot^.mot:=vraiMot;
    nvMot^.motSvt:=NIL;
     
     
       i:=tab[indice];
       cour:=tab[indice];
        while (i.mot<>MotTrie) and (i^.trieSvt <> NIL) do
          begin
            cour:=i^.trieSvt;
            i:=cour;
          end;
     
        if i.mot=MotTrie then  //mot trié déja présent
          begin
            if cour^.MotSvt = Nil then  cour^.MotSvt:=nvMot //premier "VraiMot" à insérer.
            else  //Nième "VraiMot" à insérer.
              begin
                while i^.MotSvt <> NIL do
                  begin
                    cour:=i^.MotSvt;
                    i:=cour;
                  end;
               end;
     
            cour^.motSvt:=nvMot;
     
          end
     
         else
          begin
            cour^.trieSvt:=nv;
            i:=cour^.trieSvt;
            i.motSvt:=nvMot;
            tab[indice]^.mot := IntToStr(StrToInt(tab[indice]^.mot)+1)
          end;
     
    //end;//
     
    end;
    Au niveau des destructeurs, je n'en utilise aucun.
    Merci

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Serait-il possible d'avoir également la déclaration des différents types utilisés ici ?
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    Bien sur voici la clause type :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Type
      PListe = ^Liste;
      Ttab = array [0..27000] of PListe;
     
      Liste = record
         mot:String;
         trieSvt:Pliste;
         motSvt:Pliste;
         first:boolean;
         end;

  6. #6
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut
    L'utilisation du "debugger" et parfoit trés utile;
    t'a déja débogguer ton code avec F8?
    Essaye pas à pas.
    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Ce new est bien étrange ! normalement en Delphi c'est une procédure ! As-tu fait ton propre New façon C++ ?

    Enfin, une erreur sur 00 00 00 00, c'est tout simplement une tentative d'accès à une variable à nil, dans le OnClose, OnDestroy ou la section finalization d'une de tes unités ... ou dans le DPR si celui a été modifié ...

    Sinon, il manque tout les dispose, mais je suppose que c'est une fonction général qui parcours une instance de Ttab pour libérer tout pointeur différent de nil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure DisposeTab(var tab:Ttab);
    var
      I: Integer;
    begin
      for I := Low(tab) for High(tab) do
      begin
        if tab[I] <> nil then
        begin
          Dipose(tab[I]); // comme tab est typé dispose va effectuer finalize ...
          tab[I] := nil;
        end;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    J'ai essayé la procedure dispose mais j'arrive à un stackOverflow.
    J'ai essayé de facon iterative et je retombe toujours sur la meme erreur de départ.

    Concernant le new, c'est comme ca que j'ai appris à l'utiliser. Mais je ne pense pas qu'il y ait un probleme avec ca, le programme fonctionne très bien sauf à la fermeture.

    Comment puis-je utiliser le pas-à-pas dans ce cas ci ?
    faut-il utiliser on closeQuery ?

    Merci.

  9. #9
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut Bonsoir..
    Citation Envoyé par mat777 Voir le message
    le programme fonctionne très bien sauf à la fermeture..
    S'il y'a un bouton où vous cliquer pour quitter, posé un point d'arrét
    à la première instruction que vous trouver dans l'évennement..
    Ex:
    procedure TForm1.Button1OnClick();
    begin
    x:=1; // <- Posé ici votre point d'arrèt en cliquant sur la ligne.
    if c<....
    end;
    sinon, s'il n'ya pas de bouton, chercher le "OnClose" de la forme
    que vous quitter pour fermer.

    N'oublie pas de continuer avec F8
    a+
    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    ok et que suis-je sensé trouvé ?
    des appels à des pointeurs referencant NIL ?
    des pointeurs qui ne sont pas à NIL ?

    C'est la que je bloque, lors de la fermeture de l'application tous mes pointeurs se trouvant dans mon tableau, referencent encore une adresse non NIL.

    Est-ce la le problème ?

  11. #11
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut re Bonsoir..
    Juste une question..
    T'utilise pas par hasard des composants, genre skin, ou autres..
    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  12. #12
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    non, j utilise les composants fournis avec delphi, Tform,Topendialog etc.
    Je n'utilise pas de skin.

    As-tu une solution au cas ou j'aurais utilisé des skin sans le savoir ?

  13. #13
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut re-re Bonsoir..
    Citation Envoyé par mat777 Voir le message
    As-tu une solution au cas ou j'aurais utilisé des skin sans le savoir ?
    Si vous utilisez ce genre de composants, il est fort probable qu'à la finalisation
    des unités s'engendre le problème, genre [ExceptionsExtèrnes] !!

    Sinon, je vois pas comment t'aider; navré

    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  14. #14
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    je viens d'essayer de catcher l'exception EaccessViolation dans les evenements:
    -OnCloseQuery
    -OnCloseForm

    et lorsque je fais en pas-a-pas il ne catch pas, c'est comme si l'exception se passait avant ou apres ces évenement or, je ne vois pas quand.


  15. #15
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut
    Peut tu me poster votre code, je crois que c'est mieux..
    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  16. #16
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    J'ai posté dans mon 3eme message ci-dessus la partie de mon code qui après avoir été exécutée, produit l'erreur.

    Cette procedure sert à placer des mots dans une hash table.
    Les mots se placents sans problème mais une fois qu'ils sont placés, et que je ferme l'application, j'ai l'exeption qui apparait.

  17. #17
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut Salut,
    Je ne peut pas t'aider comme ça..
    il me faut au moin la ligne où tu exécute ce code.
    J'ai copier le type + la procédure mais pour détecter
    l'érreur il me fault ce que tu donne comme paramètres à cette
    procédure..
    je vous attends.
    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  18. #18
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    Voila j'ai joint les fichiers de mon projet dans l'archive.
    Lorsque vous démarrez l'application, il faut cliquer sur "nouveau jeu" et ensuite charger le fichier "sept_en_ligne.txt" ensuite, lorsque vous fermez l'application, vous tomberez sur l'erreur.

    Un grand merci.
    Fichiers attachés Fichiers attachés

  19. #19
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut
    OK,
    pour te dire franchement, je doute de cette procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure placeMots(motTrie,vraiMot:string;indice:integer;tab:Ttab);
    je l'ai reformulée, par ceci..
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    procedure placeMots(motTrie,vraiMot:string;indice:integer;tab:Ttab);
    var cour,nv,nvMot:Pliste;
    begin
    //Creation de la cellule contenant le mot trié.
    nv:=new(PListe);
    nv^.mot:=motTrie;
    nv^.trieSvt:=NIL;
    nv^.MotSvt:=NIL;
    nv^.first:=true;
     
    //Creation de la cellule contenant le mot non trié.
    nvMot:=new(PListe);
    nvMot^.mot:=vraiMot;
    nvMot^.trieSvt:=NIL;
    nvMot^.MotSvt:=NIL; // <--- ceci été manquant
    nvMot^.first:=true;    // <--- ceci été manquant
     
    cour:=tab[indice];
    while (cour^.mot<>MotTrie) and (cour^.trieSvt <> NIL) do
    cour:=cour^.trieSvt;
     
    if cour^.mot=MotTrie
       then begin //mot trié déja présent
       if cour^.MotSvt = Nil
          then  cour^.MotSvt:=nvMot //premier "VraiMot" à insérer.
          else begin //Nième "VraiMot" à insérer.
          while cour^.MotSvt <> NIL do
          cour:=cour^.MotSvt;
          //->
          cour^.motSvt:=nvMot;
               end;  //^^Nième "VraiMot" à insérer.
       //
       Dispose(nv);
            end   //^^mot trié déja présent
       else begin
       cour^.trieSvt:=nv;
       cour^.motSvt:=nvMot;
       tab[indice]^.mot := IntToStr(StrToInt(tab[indice]^.mot)+1)
            end;
    end;
    Je l'ai essayée mais pas d'éspoire..
    Peut-Tu me décrire se que voulez vous faire exactement par cette procédure avec un dessin si possible; il serai plus compréhensible!!

    a+
    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  20. #20
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 119
    Points : 98
    Points
    98
    Par défaut
    salut,

    j'ai essayé ta version mais le problème reste le même.
    Je vais demander pourquoi j'ai ce problème à mon prof.

    Merci quand meme pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Access Violation lors de la fermeture d'une application
    Par Jean-Jacques Engels dans le forum EDI
    Réponses: 1
    Dernier message: 22/06/2011, 12h33
  2. Mysql et fermeture de l'application
    Par fredero dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/05/2005, 20h16
  3. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28
  4. Problème de fermeture de l'application
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 02h06
  5. bouton ENTER = fermeture de l'application
    Par bigboomshakala dans le forum MFC
    Réponses: 2
    Dernier message: 10/05/2004, 11h14

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