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 :

violation d'acces mémoire


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut violation d'acces mémoire
    bonjour,
    j'ai projet a faire en c++ builder 6 il est assez long et j'ai eu une violation d'acces memoir sur un benchmarck trés gros .. le programe se deroule 3 à la puissance 7 fois donc je vous laisse imaginer le temps d'execution..

    le probleme c'est que sur des petits exemples il n'y a aucun probleme mais sur celui là il me fait la tete !!

    "le projet a provoqué une classe d'exception EAccessviolation avec le message violation d'acces à l'adresse 00408301 dans le module tp.exe .ecriture de l'adresse 00000000 . processus stoppé utiliser pas à pas."

    le probleme c'est je ne sais pas du tout ou se trouve l'erreur ni comment faire pour la detecter vu que c'est trooop long avec le pas à pas !! ( il met 5minutes d'execution pour m'afficher l'erreur)

    pour info j'utilise principalement les DynamicArray .. s'il vous plait si quelqu'un a une idée pour savoir comment detecter la source du problème ..

    ( je ne peux pas poster le source vu sa longueur )

    merci

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Une violation d'accès est généralement du à un dépassement de pointeur, par exemple, si tu alloue un tableau de x pointeurs, et que tu fait une boucle de x+n sur ce tableau, tu ira écrire des données mémoires à des endroits ou tu ne devrais pas, du coup, lorsque ton programme doit accéder à ces adresses mémoires ce n'est plus une valeur attendu et tu as une violation d'accès.
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    oui je sais mais ce que je n'arrive pas à comprendre c'est pourquoi sur un exemple petit tout marche bien et sur celui la ca ne marche pas , alors que c'est exaectement la meme chose il fais tout de la meme manière sauf qu'il c'est plus gros !!!

    et ya t'il un moyen de détecter ca , car je ne sais pas par ou commencer et vous imaginez le pas a pas !! impossible de voir...

    j'ai essayé tout à l'heur de faire du pas à pas comeme et au 4800 cas il m'a dit mémoire insuffisante ( alors que j'etait sur 1GO de ram ) koi faire svp ..

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Tout dépend de ton petit et de ton gros, si ta grandeur varie sur le nombre de boucle, tu ne dépasse pas forcement, si c'est la taille alloué, c'est que ça va écrire sur beaucoup plus d'espace ou il na pas le droit et du coup, il va toucher plus facilement des espace important pour le système ou l'appli.

    1Go de ram ça devrait tenir normalement, la limite et de 2Go par appli (limite fixé par windows) sauf pour le 64bit ou la c'est 4Go par appli, mais attention, il existe des "bug" sous bcb qui ne gère pas forcement la mémoire correctement et qui pourrait faire planté ton appli avant les 2Go, mais dans ce cas la tu aurai plutôt une erreur EEfface Error
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonsoir,

    Pour détecter des violations d'accès, je te conseille de compiler ton projet avec 'Code Guard'.

    Pour l'activer, tu vas dans les propriétés de ton projet, tu sélectionnes l'onglet 'Code Guard', tu sélectionnes tous les 'Check box'.

    Puis, tu fais un build complet de ton application.

    Enfin, tu lances, et tu croises les doigts pour qu'il te détecte quelque chose

    Cordialement,

    Benjamin

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    j'ai fais comme tu as dis et la construction complète s'est faite normalement sans souci

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    j'ai meme scotché le bouton F8 et quand la violation a eu lieu j'ai trouvé le curseur la ou je l'ai laissé donc j'ai pas pu detecté ou exactement

    je suis desepéré et il faut que ca se regle !

    heeeeeeeelp !

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    je viens d'executer avec le code guard et j'ai eu un certain journal que je n'arrive pas à appréhender

  9. #9
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Peut tu mettre une copie de ce journal (texte ou image)
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    oui voici le lien :

    http://yesil08.ifrance.com/


    merci.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Re

    Comme te le propose Pottiez, n'hésite pas à poster ce rapport.

    Parce que sans plus d'information, il semble difficile d'avoir une réponse.

    Les origines d'une violation d'accès, peuvent être diverses et variés.

    Et dans le meilleur des cas, et si cela t'est possible, poste le code source de ton programme.

    Cordialement,

    Benjamin

    EDIT Oups, désolé Tu as posté entre temps.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Effectivement... tout cela n'est pas très parlant.

    Est-il possible de poster le code de ta fonction 'generer_solution'?

    Benjamin

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    Matrice generer_solution(Matrice MTE,Matrice MEO,Matrice MED,Matrice MTP )
    {
    int base;
    long cpt=1;
    base =MTE.Length;
    DynamicArray < int > tab_verite ;
    Matrice solution;

    for(int i=0;i<=MTE[0].Length-1;i++)
    {
    tab_verite.Length++;
    tab_verite[i]=0;
    }

    float TES,TEP,MOY;
    bool fin=false;
    while (!fin) // generer les combinaison
    { TES=0;TEP=0;MOY=0;


    FCout1(tab_verite,MTE,MTP,TES,TEP,MOY,MEO,MED,base);

    solution.Length++;
    solution[solution.Length-1].Length=MTE[0].Length+3;
    solution[solution.Length-1][0]=MOY;
    solution[solution.Length-1][1]=TES;
    solution[solution.Length-1][2]=TEP;
    for(int j=3;j<=solution[0].Length-1;j++)
    {

    solution[solution.Length-1][j]=tab_verite[j-3];
    }


    if ( cpt == pow(MTE.Length,MTE[0].Length))fin =true ;


    tab_verite[0]=(tab_verite[0]+1)%base;

    for(int i=1;i<=tab_verite.Length-1;i++) // teste d'arret
    {
    if ((tab_verite[i-1]==0)&&(!fin))
    tab_verite[i]=(tab_verite[i]+1)%base;
    else
    break;
    }



    cpt++;


    }





    return(solution);
    }

    j'ai une question à poser , moi je stock tout dans un DynamicArray puis je l'afficher dans un StringGrid est ce que le tableau dynamique supporte une telle charge ?? car c'est la seule explication que je vois ..

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    A vrai dire, je ne vois pas...

    Je ne connais pas les DynamicArray...

    En voyant le rapport de Code Guard, j'aurai tendance à dire que l'erreur survient au niveau de ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    solution.Length++;
    Je dis cela par rapport à la ligne System:ynamicArray<int> >::set_length(int)...
    Mais bon... vraiment pas persuadé... Sans connaitre le fonctionnement des DynamicArray, je ne veux pas te guider vers de fausses pistes.

    Désolé.

    Benjamin

  15. #15
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    bonjour,


    solution.length++; alloue une nouvelle case dans le dynamiqueArray, moi aussi je pense que le DynamicArray a une limite car c'est tous ce qui peu expliquer une telle erreur mais j'aimerais bien que quelqu'un me le confirme..

    merci

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Il faudrait vérifier si quelque chose renvoie NULL en lieu et place de déclencher une exception !
    Donc vérifier à quoi correspond cette adresse.
    Donc tester le pointeur à chaque fois que l'on modifie !

    A plus !

Discussions similaires

  1. Violation d'accès mémoire TIdFTP
    Par ac/dc dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/08/2011, 11h59
  2. TStringList et Violation d'accès mémoire
    Par Weirdy dans le forum Langage
    Réponses: 2
    Dernier message: 15/06/2011, 10h23
  3. Violation accès mémoire
    Par BenjaminLustrement dans le forum C
    Réponses: 9
    Dernier message: 09/06/2006, 10h07
  4. Violation d'acces apres Execute
    Par SegmentationFault dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 10/08/2004, 16h23
  5. Violation d'accès apres Close
    Par SegmentationFault dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/07/2004, 16h46

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