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++Builder Discussion :

access violation at 0x32825c2e:read of adress 0x0000008


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut access violation at 0x32825c2e:read of adress 0x0000008
    Bonjour,
    je suis entrain de developper une petite application de gestion ndu personnel sous c++ builder 2007
    à chaque ajout de code j'execute pour voir s'il y a des erreurs
    en ajoutant un code à un boutton et en executant le message d'erreur suivant sa'affiche :

    Echec du projet c/:RadStudio/GestionPersonnel.exe avec le message :'access violation at 0x32825c2e:read of adress 0x00000008' . Processus stoppé.Utilisez pas à pas ou executer pour continuer.

    jai executé pas à pas: j'obtiens la meme erreur et le meme message.
    à quoi ceci est il du?
    que dois je faire?

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Tu essai probablement d'accéder à un objet qui est pas alloué ou dont la référence est incorrecte.

    Mais si tu ne poste pas le bout de code qui pose problème, on va avoir du mal a t'aider!

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    il s'agit ici de preciser le nombre des mutations qui n'ont pas étées mises à jours depuis 7 jours ou plus.
    ensuite mettre la liste des matricules des mutations dans un combobox dans une autre forme (frmmrl)
    voici le code du bouton:
    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
    void __fastcall Tacc::BtmrlClick(TObject *Sender)
    {
    TDate date1;
    TDate date2;
    date1=Date();
    int i=0,j;
    int nbrJrs;
    int * t;
    t[0]=0;
    ADOConnection1->Open();
    ADOQuery1->SQL->Add("select Matricule,D_LastUpdate from Mutations");
    ADOQuery1->Open();
    ADOQuery1->First();
    do {
    	date2=ADOQuery1->FieldByName("D_LastUpdate")->AsDateTime;
    	nbrJrs=DaysBetween(date1,date2);
    		if (nbrJrs>=7) {
    			i++;
    			t[i]=ADOQuery1->FieldByName("Matricle")->AsInteger;}
    	ADOQuery1->Next();
    }while (!ADOQuery1->Eof);
    if (i==0) {int rep1= MessageBox(Handle,"Vous n'avez pas de mutations à relancer", "Avertissement",MB_OK|MB_ICONSTOP );
    		if (rep1==IDOK){
    			acc->Show();
    			}
     
    }
    else { for (j = 1; j <= i; j++) {
    	frmmrl->ComboBox1->Items->Add(t[j]);
    	   }
    	frmmrl->Show();
     
    }
     
     
    }
    j'ai essayé d'initialiser le pointeur t avec NULL mais ça donne le meme type d'erreur !

  4. #4
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    L'exception est normal:
    tu déclare un pointeur (t), mais tu n'alloue pas d'espace mémoire. Donc forcément quand tu essai d'accéder à t[x], tu as une exception déclenchée!

    Plusieurs remarques :
    - Utilise plutôt une boucle while (à la place d'une do...while)
    - Pourquoi passer par ta variable t (qui me semble inutile), et ne pas faire directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [...]
       if (nbrJrs>=7) 
       {
          i++;
          frmmrl->ComboBox1->Items->Add( ADOQuery1->FieldByName("Matricle")->AsString ) ;
       }
    [...]

  5. #5
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Voici une proposition de code qui devrait fonctionner, a tester:
    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
      TDate date1 = Date();
      TDate date2;
      int i=0;
      ADOConnection1->Open();
      ADOQuery1->SQL->Add("select Matricule,D_LastUpdate from Mutations");
      ADOQuery1->Open();
      ADOQuery1->First();
      while( !ADOQuery1->Eof )
      {
         date2=ADOQuery1->FieldByName("D_LastUpdate")->AsDateTime;
         if( DaysBetween(date1, date2) >= 7 )
         {
           i++;
           AnsiString mat = ADOQuery1->FieldByName("Matricle")->AsString;
           frmmrl->ComboBox1->Items->Add( mat );
         }
         ADOQuery1->Next();
      }
      if (i==0)
      {
        MessageBox(Handle,"Vous n'avez pas de mutations à relancer", "Avertissement",MB_OK|MB_ICONSTOP ) ;
        acc->Show();
      }
      else
        frmmrl->Show();
    - J'ai supprimer quelques variables et tests qui me semblaient inutiles, à toi de les remettre si tu en as besoin.

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Merci infiniment,
    je me suis servi d'un tableau à 100 élément en esperant que le nombre de mutations n'atteindra jmais ce chiffre. Mais il s'avere que ce n'est guerre pertinent!

    Par contre ton code marche tres bien et sans erreur.

    Au passage, par quel moyen alloue t on de l'espace mémoire?
    Mille merci encore.

  7. #7
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    pour allouer un tableau de 100 entier par exemple:
    tu peux ensuite accéder aux éléments
    Pour allouer un objet, tu utilise le mot clé new, par exemple TList:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TList *list = new TList() ;
    puis pour le liberer l'objet tu utilise le mot clé delete
    (tout élément allouer par new doit impérativement être libérer par delete!):

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Merci beuacoup
    je ne devais pas oublié si rapidement!

    Merci encore

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    On peut aussi faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int *t = new int(100);
    t[99] = 100; // min = 0 max = 99
    delete t;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    t = new int[100];
    t[99] = 55; // min = 0 max = 99
    delete[] t;
    Normalement, on utilise la 1ère syntaxe. La 2ème permet surtout de faire des tableau de tableau. Le tout dynamiquement.
    Autre détail, tu peux mettre un variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int i = 100;
    int *t = new int(i);
    t[99] = 12; // min = 0 max = i-1
    delete t;
    Alors que l'on est obligé de mettre une constante pour ces tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = 100;
    int t[i]; // ne fonctionne pas, ne compile pas
    Donc tu est obligé d'utiliser un tableau dynamique quand tu ne connais pas à l'avance sa taille.

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Merci gandf
    c'est encore plus clais avec tes explications

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

Discussions similaires

  1. Access violation at adress in module 'toad.exe'
    Par haykelFST dans le forum Toad
    Réponses: 1
    Dernier message: 19/09/2012, 10h26
  2. "access violation reading location"
    Par Vanito dans le forum C
    Réponses: 7
    Dernier message: 30/06/2011, 20h49
  3. Access violation reading
    Par rXpCH dans le forum C++
    Réponses: 6
    Dernier message: 22/06/2011, 13h07
  4. access violation at adress 0057744.read of address 000000
    Par zanoubya dans le forum Débuter
    Réponses: 2
    Dernier message: 21/06/2010, 18h34
  5. [débutant]Access violation reading location
    Par gate35 dans le forum C++
    Réponses: 6
    Dernier message: 13/05/2009, 15h32

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