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 violation d'accès


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Par défaut Problème violation d'accès
    Bonjour,

    Je poste ce message au cas où un oeil neuf remarque quelque chose qui m'a échappé.
    Je travaille sur un programme qui effectue des calculs sur des matrices de complexes. L'ensemble de mes fonctions de calculs fonctionnent parfaitement, sauf une qui me fait l'erreur suivante :
    "Le projet **** a déclancher la classe d'exception EAccessViolation avec le message "Violation d'accès"."
    La fonction renvoyant cette erreur fonctionne très bien puisqu'elle a été appelée de nombreuses fois auparavant. J'ai pensé à un paramètre mal passé mais ils sont tous correct (l_1=l_2=1 et c_1=c_2=5).

    Le programme est pour l'instant une fenêtre DOS qui utilise environ 2 Mo de mémoire d'après le gestionnaire Windows (le système en possédant 2Go). Je programme sous C++ Builder 2007 version entreprise qui ne donne pas plus d'information sur l'erreur.


    fcomplex : structure définissant un nouveau type qui est composé de 2 double (partie réelle et partie imaginaire)

    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
    extern fcomplex** Cadd_mat (fcomplex **mat1, int l_1, int c_1, fcomplex **mat2, int l_2, int c_2)
    {
    	    int i, j;
    	    fcomplex **res;
    	    res = Callocation_dynamique(l_1, c_1);  // Allocation dynamique matrice
     
    // Verification des dimensions des matrices, si les dimensions sont differentes le calcul est impossible.
        if (l_1 != l_2)
        {
           printf("Dimensions incorrectes : nombres de lignes different");
           exit(EXIT_FAILURE);
        }
        if (c_1 != c_2)
        {
             printf("Dimensions incorrectes : nombres de colonnes different");
             exit(EXIT_FAILURE);
        }
        else		// Si dimension identique :
        {
             for (i = 0; i < l_1; i++)
             {
                  for (j = 0; j < c_1; j++)
                  {
                         res[i][j] = Cadd(mat1[i][j], mat2[i][j]);   // Ligne indiquant l'erreur
                  }
             }
       }
       return res;
    }
     
     
     
    extern fcomplex Cadd(fcomplex a, fcomplex b)
    {
    	fcomplex c;
    	c.r = a.r + b.r;
    	c.i = a.i + b.i;
    	return c;
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Présenté comme cela, je dirai qu'un des matrices passée en paramètre n'a pas la dimension indiquée ou que la fonction Callocation_dynamique n'alloue pas suffisamment de mémoire.

    Peux tu poster un code minimal qui s'exécute et reproduit le problème ? Un simple main et la fonction Callocation_dynamique.

    PS : merci de penser aux balises code (#)

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Par défaut
    Merci pour ta réponse.
    Je pense avoir trouvé pour la raison pour laquelle ça ne fonctionne pas. Mes matrices ont bien les bonnes dimensions mais les valeurs de matrice 1 ne sont pas transmises car je ne peux pas les afficher. Je vais regarder ça plus en détails déja. Reste à savoir pour quelle raison elles ne sont pas transférer.

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Par défaut
    C'est bien le passage de la matrice 1 le problème. J'ai l'impression que toute la place disponible dans la pile est allouée. Y a t'il un moyen de libérer de la mémoire pendant l'exécution du programme? Je n'envisage pas d'augmenter la taille de la pile car moins du 5ème du programme est exécuter.

    Merci d'avance.

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par flo-1987 Voir le message
    J'ai l'impression que toute la place disponible dans la pile est allouée.
    Les dépassement de pile génèrent plutôt des stack overflow...

    Citation Envoyé par flo-1987 Voir le message
    Y a t'il un moyen de libérer de la mémoire pendant l'exécution du programme?
    La mémoire de la pile, non.
    La mémoire du tas, oui, il suffit d'appeler free, là où on a appelé malloc, calloc...

    Attention, la violation d'accès n'est pas du directement à un éventuel manque de mémoire.

    Pour savoir s'il manque de la mémoire, il suffit de tester le retour de malloc, calloc... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void * p;
    p = malloc(15324);
    if(NULL == p) {
      /* l'allocation a échoué */
      perror("malloc");
    } else {
      /* faire des choses avec la mémoire allouée */
      /* ... */
      /* la libérer */
      free(p);
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Par défaut
    J'y ai pensé et désallouer la mémoire des matrices dès qu'elles ne sont plus utilisées, ça m'a fait avancer d'une dizaine de lignes. Les seules matrices que j'ai pu effacé sont des "petites" matrices (du genre 7*3) et je suis obligé de garder les "grosses" matrices (2800*9, 29*400, 400*12) jusqu'à la fin du programme.

  7. #7
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    • on ne sait pas comment sont allouées tes matrics mat1 et mat2

    • dans ce code :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
       
      	    int i, j;
      	    fcomplex **res;
      	    res = Callocation_dynamique(l_1, c_1);  // Allocation dynamique matrice
       
      // Verification des dimensions des matrices, si les dimensions sont differentes le calcul est impossible.
          if (l_1 != l_2)
          {
             printf("Dimensions incorrectes : nombres de lignes different");
             exit(EXIT_FAILURE);
          }
      • Il n'y a pas de test pour savoir si l'allocation réussit ou échoue

      • Le test sur les conditions du calcul se fait après l'allocation

      • Si on ne peut pas calculer, la mémoire allouée n'est pas libérée.

  8. #8
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Par défaut
    Le test est effectué dans la fonction d'allocation. Je vais regarder la position des allocation dans mes fonctions et les déplacer si besoin ai. Je n'avais pas penser à les placer à certains endroit de manière très précise lors de mes tests. Merci pour cette remarque.


    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
    fcomplex **Callocation_dynamique(int ligne,int colonne)
    {
    	// Définition des variables :
    	int i;                              		// Variable de boucle
    	fcomplex **p;                         		// Matrice qu'on va allouer puis retourner
    	p=(fcomplex**)calloc(ligne,sizeof(*p));    	// Allocation des lignes (pointeurs de début de ligne) de la matrice
    	if(p==NULL)
    	{
    		fprintf(stderr,"ERROR Allocation 1 impossible !");
    		getchar();
    		getchar();
    		exit(EXIT_FAILURE);                    	// Erreur renvoyée si l'allocation n'a pas fonctionné
    	}
    	for(i=0;i<ligne;i++)
    	{
    		p[i]=(fcomplex*)calloc(colonne,sizeof(**p));          // Allocation des colonnes (éléments) de la matrice
    		if(p[i]==NULL)
    		{
    			fprintf(stderr,"ERROR Allocation 2 impossible !");
    			getchar();
    			getchar();
    			exit(EXIT_FAILURE);                             // Erreur renvoyée si l'allocation n'a pas fonctionné
    		}
    	}
    	return(p);
    }

  9. #9
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    2 petites remarques sur ce code :

    si l'allocation d'une ligne échoue, tu ne libère ni les lignes précédemment allouées, ni le tableau des lignes, avant de sortir.

    Maintenant, ceci ne nous montre pas comment tu t'en sers à part dans la routine que tu as montré.

    "Access violation" veut dire que soit tu débordes avec un indice, soit tu ne débordes pas mais tu tapes dans un endroit qui n'a pas une valeur correcte (un pointeur non initialisé, une valeur non initialisée, etc etc).

  10. #10
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Par défaut
    J'ai resolu le problème en modifiant le prototype de la fonction. En fait j'allouait deux fois la mémoire nécessaire comme je fesais ce qui n'ai plus le cas avec le nouveau prototype.

    Merci encore pour votre aide, ça m'a permit de trouver plusieurs parties de code mal faites.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Cadd_mat (fcomplex **res, fcomplex **mat1, int l_1, int c_1, fcomplex **mat2, int l_2, int c_2)

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

Discussions similaires

  1. Problème violation d'accès
    Par waste dans le forum Débuter
    Réponses: 3
    Dernier message: 26/09/2012, 17h25
  2. Problème Violation d'accès drag&drop entre 2 tableaux
    Par flash11 dans le forum Débuter
    Réponses: 2
    Dernier message: 20/08/2011, 10h04
  3. Réponses: 5
    Dernier message: 13/01/2007, 19h45
  4. [vb 2005]Problème de violation d'accès concurentiel
    Par estelledany dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/06/2006, 17h14
  5. Problème de violation d'accès
    Par Oluha dans le forum Bases de données
    Réponses: 11
    Dernier message: 31/05/2005, 10h26

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