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 :

class EAccesViolation SVP


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut class EAccesViolation SVP
    Bonjour,
    J'ai un program qui n'a aucun prob lors de la compilation mé à l'exécution, un warning est affiché:



    Mon compilateur (C++ Builder) met une flêche jaune a coté de la ligne où réside le problème (que je met en grave au dessous). Pourriez-vous m'éclairer les fautes? s'il vous plait c'est très urgent, je verifie souvent la page pour vos réponses.
    Merci beaucoup.


    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
    void qrdcmp(float **A, int N, float *c, float *d, int *sing)
    {
    	int i,j,k;
    	float scale,sigma,sum,tau;
    	
    	*sing=0;
    	for (k=0;k<N-1;k++) 
    		{
    		scale=0.0;
    		for (i=k;i<N;i++) 
    			{
    			if (scale>=fabs(A[i][k])) 
    				{
    				scale=scale;
    				} 
    			else 
    				{
    				scale=fabs(A[i][k]);
    				}
    			}
    		
    		if (scale == 0.0) 
    			{ 
    			*sing=1;
    			c[k]=d[k]=0.0;
    			} 
    		else 
    			{ 
    			for (i=k;i<N;i++) A[i][k] /= scale;
    			for (sum=0.0,i=k;i<=N;i++) sum += (A[i][k])*(A[i][k]);			if (A[k][k]>=0) 
    			{
    				sigma=sqrt(sum);
    			}
    			else 
    			{
    				sigma=-sqrt(sum);
    			}
    			A[k][k] += sigma;
    			c[k]=sigma*A[k][k];
    			d[k] = -scale*sigma;
    			for (j=k+1;j<N;j++) 
    				{
    				for (sum=0.0,i=k;i<=N;i++) sum += A[i][k]*A[i][j];				tau=sum/c[k];
    				for (i=k;i<N;i++) A[i][j] -= tau*A[i][k];
    				}
    			}
    		}
    	d[N]=A[N-1][N-1];
    	if (d[N-1] == 0.0) *sing=1;
    }

    Vous trouverez ci-joint le fichier du program complet si vous voulez l'éxécuter.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 554
    Par défaut
    Segfault :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void qrdcmp(float **A, int N, float *c, float *d, int *sing)
    {
      ...
    *sing=0;
    Tu essaies d'écrire zéro à l'adresse indiquée par le pointeur « sing », lequel t'est passé en paramètre. Fort bien, mais cela n'empêche pas la fonction appelante de te transmettre n'importe quoi.

    Le problème se situe vraissemblablement au niveau d'au dessus.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    merci de votre réponse.
    En fait, à part de cette fonction, le reste du program se compose:
    - une fonction d'allocation mem pour matrice
    - une autre pour sa libration
    - une fonction saisir matrice
    - une fonction afficher matrice
    - fonction main

    g deja testé av succès ces 5 fonctions avant d'y integer void qrdcmp(float **A, int N, float *c, float *d, int *sing)

    (/* Les prototypes de fonctions utilisé */)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int Menu ( void );
    float** Allocate_Mat_Memory ( int );
    void Free_Mat_Memory ( float**, int );
    void Affiche_Mat ( float**, int );
    void Saisi_Mat ( float**, int );
    void qrdcmp(float **A, int N, float *c, float *d, int *sing);
    le prob doit se situer ds la fonction qrdcmp et en effet le compilateur a positionné sur la ligne
    Vous pouvez le vérifier en compilant le fichier essaie.c (ci-joint) par C++ Builder.

    J'attends tjrs vos réponses.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 554
    Par défaut
    Citation Envoyé par wintercold Voir le message
    g deja testé av succès ces 5 fonctions avant d'y integer void qrdcmp(float **A, int N, float *c, float *d, int *sing)

    le prob doit se situer ds la fonction qrdcmp et en effet le compilateur a positionné sur la ligne
    Comme je te l'ai dit, le problème vient de ce qui appelle « qrdcmp » car la valeur du cinquième paramètre (« sing ») est invalide. Le code est tout-à-fait correct sur la forme, et c'est pour cela qu'il compile sans erreur, mais la valeur du paramètre ne l'est pas.

    Je jette un œil sur ton source.

    MàJ : dans main(), on trouve :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int *sing = 0; /* Ligne 149 */
     
    ...
     
    qrdcmp(matrice1, N, c, d, sing); /* Ligne 180 */

    Donc, tu définis un pointeur sur int dans ta fonction main() et tu l'initialises avec l'adresse 0x00000000. Ensuite, tu passes ce pointeur à ta fonction, qui essaie donc d'écrire à cette adresse. Donc, ça plante. Et si tu lis le message d'erreur, tu t'aperçois qu'il te l'explique en clair : « Write of address 00000000 ».

    Peut-être voulais-tu que ta fonction stocke son résultat dans une variable. Dans ce cas, il aurait fallu déclarer un entier et non un pointeur sur un entier, soit int sing = 0; sans l'astérisque « * », et passer l'adresse de cette variable à ta fonction, avec « &sing » plutôt que « sing » seul.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    peut-être g trouvé la sortie pour le souci sur la ligne *sing=0.
    En fait, ds la declaration des variables ds la fonction main, javais initializé *sing=0.

    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
    void main()//void)
    { 
        FILE *fpt;
        float *c=0, *d=0;
        int *sing=0;
        float **matrice1;
        int N=1;
        char caractere;
    
        fpt = fopen("notesma11.dat","r");
    	if(fpt == NULL)
    	{
    		printf("\nError: File couldn't be opened (1).\n");
    		exit(-1);
    	}
    	do
            {
                caractere = fgetc(fpt); // On lit le caractère
              
    			if(caractere == '\n')
    			{
    				N=N+1;
    			}
    			
    
            } while (caractere != EOF);
        fclose(fpt);
    
              
                    printf("Nombre de lignes: %d  \n",N);     
                    matrice1 = Allocate_Mat_Memory( N );
                             
                    Saisi_Mat( matrice1, N );
                    printf("La Matrice saisie:\n\n");
                    Affiche_Mat( matrice1, N);
    		qrdcmp(matrice1, N, c, d, sing);
    Affiche_Mat( matrice1, N);
    ....
    Quand je met seulement int *sing; ce souci est enlevé mais g tjrs le même warning et maintenant la faute se trouve à la ligne en grave (ds la fonction qrdcmp):

    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
    ...
    if (scale == 0.0) 
    			{ 
    			*sing=1;
    			c[k]=d[k]=0.0;
    			} 
    		else 
    			{ 
    			for (i=k;i<N;i++) A[i][k] /= scale;
    			[B]for (sum=0.0,i=k;i<=N;i++) sum += (A[i][k])*(A[i][k]);[/B]
    			if (A[k][k]>=0) 
    			{
    				sigma=sqrt(sum);
    			}
    			else 
    			{
    				sigma=-sqrt(sum);
    			}
    ...

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par wintercold Voir le message
    Quand je met seulement int *sing; ce souci est enlevé
    Non, tu n'as rien résolu ici. Le code invoque un comportement indéfini, il peut sembler fonctionner correctement, mais ce n'est qu'une impression.
    Regarde plutôt l'explication de Obsidian qui fourni la solution à ce problème.

    Au passage, tu as le même problème avec les variables c, d et matrice

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 554
    Par défaut
    Citation Envoyé par wintercold Voir le message
    peut-être g trouvé la sortie pour le souci sur la ligne *sing=0. En fait, ds la declaration des variables ds la fonction main, javais initializé *sing=0. Quand je met seulement int *sing; ce souci est enlevé.
    NON !

    D'abord, ce n'est pas un warning mais une authentique erreur à l'exécution. Ensuite, en initialisant le pointeur à zéro, tu écrivais à un endroit incorrect mais tu pouvais le localiser et tu étais à peu près sûr que ton programme s'arrêterait. À présent, ton pointeur contient une valeur indéfinie, et si ton programme ne plante plus, c'est qu'il écrit n'importe où au sein d'un segment de mémoire qui t'appartient.

    C'est encore pire !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Je suis d'accord avec vous mais désolé le program est tjrs "bugged" sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (sum=0.0,i=k;i<=N;i++) sum += (A[i][k])*(A[i][k]);

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Apparemment, A a pour dimensions NxN. Pourquoi (si c'est le cas) la condition i<=N ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Citation Envoyé par diogene Voir le message
    Apparemment, A a pour dimensions NxN. Pourquoi (si c'est le cas) la condition i<=N ?
    tt à fait, il fo enlever "=". le bug passe maintenant sur Je ne vois rien qui va pas sur cette ligne.

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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
    void main()//void)
    {
        FILE *fpt;
        float *c=0, *d=0;
    ...
    	  qrdcmp(matrice1, N, c, d, sing);
    ...
     
    void qrdcmp(float **A, int N, float *c, float *d, int *sing)
    {
    ...
    	for (k=0;k<N-1;k++)
    		{
    ...
    		if (scale == 0.0)
    			{
    			*sing=1;
    			c[k]=d[k]=0.0;
    			}
    		else
    			{
    ...
    			A[k][k] += sigma;
    			c[k]=sigma*A[k][k];
    			d[k] = -scale*sigma;
    ...
    Normal, c et d ne sont pas des tableaux mais des pointeurs.
    Le programme aurait pu planter également sur c[k]=d[k]=0.0;

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Je vous remercie beaucoup. tout est éclairé.

Discussions similaires

  1. classe generique SVP
    Par boumaziane dans le forum C#
    Réponses: 2
    Dernier message: 14/07/2013, 20h13
  2. La classe php "GoogleMapAPI" svp
    Par monder_reh dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 13/03/2012, 19h02
  3. Réponses: 0
    Dernier message: 03/02/2011, 11h17
  4. Explication d'une classe que je ne comprends pas svp
    Par beegees dans le forum Langage
    Réponses: 8
    Dernier message: 15/04/2007, 14h12
  5. Réponses: 6
    Dernier message: 07/03/2006, 11h51

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