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 :

Verification de carré magique - Erreur de segmentation


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Verification de carré magique - Erreur de segmentation
    Bonjour

    je débute en langage C, je suis en DUT informatique actuellement, en ce moment j'essaye de créer un script qui verifié si un carré est magique à l'aide d'un tableau à deux dimensions.

    Le total d'un ligne d'un carré magique doit etre egal au total de toutes les autres lignes mais aussi au total de la somme des colones et des diagonales.

    exemple :

    J'ai réussi a compilé le programe (je travail sous ubuntu avec le comilateur gcc) seulement aprés la saisie du tableau par l'utilisateurs il y a une erreur de segementation.

    Je pense que les incrémentations ne sont pas correct non plus.

    Est ce que quelqu'un pourait m'aider si il vous plait ?

    voici mon code :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define max 3 
     
     
     
    int main(void)
     
     
     
    {
     
     
     
    			/*Declaration des variables*/
     
     
     
     
     
    			/*Variable entré par l'utilisateurs*/
     
     
     
         int tab[max][max];
     
         char quitter='n';
     
    			/*Variables de traitement des données*/  
     
     
     
     
     
         int somme1[max], somme2[max], somme3[max],i ,j ,sommeD ,somme2D ;
     
     
     
     
    			/* Saisie des informations dans le tableau */
     
     
     
     
     
     
     
        while (quitter != 'o')
     
     
     
    {                 
     
                  for (i=0;i<=max;i++)
     
     
     
               {
     
                           for (j=0;j<=max;j++)
     
     
     
                      {
     
     
     
                               printf("\n veuillez entrez la %d valeur de la %d ligne",j,i);
     
                               getchar();
     
                               scanf("%d",&tab[i][j]);
     
     
     
                      }
     
     
     
              }
     
     
     
     
     
     
     
     
     
     
     
    			  /* Verification des lignes */
     
     
     
     
     
               for (i=0;i<=max;i++)
     
     
     
         {
     
     
     
                   for (j=0;j<=max;j++)
     
     
     
               {
     
     
     
                       somme1[j++]=tab[i][j]+somme1[j];
     
     
     
               }
     
     
     
                   if (somme1[j] != somme1[j++])
     
     
     
               {
     
     
     
                      printf("Ce tableau n'est pas un carré magique");
     
                      sleep(5);
     
                      exit(EXIT_SUCCESS);
     
     
     
               }
     
     
     
         }
     
     
     
     
     
                             /* Colones */
     
     
     
     
     
     
     
     
     
               for (i=0;i<=max;i++)
     
     
     
         {
     
     
     
                   for (j=0;j<=max;j++)
     
     
     
               {
     
     
     
                       somme2[j++]=tab[j][i]+somme2[j];
     
     
     
               }
     
     
     
                   if (somme2[j] != somme2[j++])
     
     
     
               {
     
     
     
                      printf("Ce tableau n'est pas un carré magique");
     
                      sleep(5);
     
                      exit(EXIT_SUCCESS);
     
     
     
               }
     
     
     
         }                 
     
     
     
     
     
                               /* Diagonales Droite */
     
     
     
     
     
              for (i=0;i<=max;i++)
     
     
     
         {
     
     
     
                  for(j=0;j<=max;j++)
     
     
     
              {
     
     
     
                      sommeD=tab[j][j]+sommeD;
     
     
     
              }
     
     
     
         }
     
     
     
     
     
                          /*Diagonales Gauche*/
     
     
     
     
     
               for(i=0;i<=max;i++)
     
     
     
         {
     
     
     
                   for (j=max;i<=0;j--)
     
     
     
               {
     
     
     
                       somme2D=tab[j][i]+somme2D;
     
     
     
               }
     
     
     
         }
     
     
     
               if (sommeD==somme2D)
     
     
     
         {
     
     
     
               printf("Ce tableau est un carré magique");
     
     
     
         }
     
     
     
               else
     
     
     
         {
     
     
     
               printf("Ce tableau n'est pas un carré magique");      
     
     
     
         }
     
     
     
     
     
         printf("si vous voulez examiner un autre tableau tapez la minuscule o sinon tapez la minuscule n:");
     
         getchar();
     
         scanf("%c",&quitter);
     
     
     
     
     
    }
     
     
     
    return(0);
     
    }

    il est fort possible que dans le code il est d'autre fautes car je débute en C.

    Merci beaucoup par avance à tous le monde.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Tu devrais séparer ton code en fonctions pour le rendre plus compréhensible.

    Et surtout, supprimer toutes ces lignes vides en trop...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Tiens, je suis bonne poire, j'ai fait un peu de ménage.
    Code C : 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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define TAILLE_CARRE 3 
     
    int main(void)
    {
    	/*Declaration des variables*/
    	/*Variables entrées par l'utilisateur*/
    	int tab[TAILLE_CARRE][TAILLE_CARRE];
    	char quitter='n';
     
    	/*Variables de traitement des données*/  
    	int somme1[TAILLE_CARRE], somme2[TAILLE_CARRE], somme3[TAILLE_CARRE],i ,j ,sommeD ,somme2D ;
     
    	/* Saisie des informations dans le tableau */
    	while (quitter != 'o')
    	{
    		for (i=0;i<=TAILLE_CARRE;i++)
    		{
    			for (j=0;j<=TAILLE_CARRE;j++)
    			{
    				printf("\n veuillez entrez la %d valeur de la %d ligne",j,i);
    				getchar();
    				scanf("%d",&tab[i][j]);
    			}
    		}
     
    		/* Verification des lignes */
    		for (i=0;i<=TAILLE_CARRE;i++)
    		{
    			for (j=0;j<=TAILLE_CARRE;j++)
    			{
    				somme1[j++]=tab[i][j]+somme1[j];
    			}
    			if (somme1[j] != somme1[j++])
    			{
    				printf("Ce tableau n'est pas un carré magique");
    				sleep(5);
    				exit(EXIT_SUCCESS);
    			}
    		}
     
    		for (i=0;i<=TAILLE_CARRE;i++)
    		{
    			for (j=0;j<=TAILLE_CARRE;j++)
    			{
    				somme2[j++]=tab[j][i]+somme2[j];
    			}
     
    			if (somme2[j] != somme2[j++])
    			{
    				printf("Ce tableau n'est pas un carré magique");
    				sleep(5);
    				exit(EXIT_SUCCESS);
    			}
    		}
     
    		/* Diagonales Droite */
    		for (i=0;i<=TAILLE_CARRE;i++)
    		{
    			for(j=0;j<=TAILLE_CARRE;j++)
    			{
    				sommeD=tab[j][j]+sommeD;
    			}
    		}
     
    		/*Diagonales Gauche*/
    		for(i=0;i<=TAILLE_CARRE;i++)
    		{
    			for (j=TAILLE_CARRE;i<=0;j--)
    			{
    				somme2D=tab[j][i]+somme2D;
    			}
    		}
     
    		if (sommeD==somme2D)
    		{
    			printf("Ce tableau est un carré magique");
    		}
    		else
    		{
    			printf("Ce tableau n'est pas un carré magique");      
    		}
     
    		printf("si vous voulez examiner un autre tableau tapez la minuscule o sinon tapez la minuscule n:");
    		getchar();
    		scanf("%c",&quitter);
    	}
     
    	return(0);
     
    }
    Déjà, ce code est très sale, avec une mauvaise utilisation de getchar() et scanf() pour quitter, des exit() à tire-larigot...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Verification d'un carré magique.
    Bonjour et merci d'avoir répondu.

    Comment cela séparer le code en fonction ?

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Verification d'un carré magique.
    Merci Beaucoup pour ce petit ménage seulement j'ai toujours cette erreurs de segmentation lorsque je rentre les valeurs dans le tableau.

    Enfait les getchar sont placé ainsi car losrque qu'il y a des '/n' dans les printf le scanf prend la valeur '/n'. C'est ce que m'as dit ma prof de TP

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Utilise plutôt ceci que getchar(), quand tu veux vider une ligne après un scanf:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int fpurge(FILE *pf)
    {
    	int c;
    	while((c=getchar())!='\n' && c!=EOF) {}
     
    	/*retourne 0 si OK, -1 si EOF*/
    	return (c==EOF ? -1 : 0);
    }
    Et ça s'emploie ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int valeur;
    int nScan;
    nScan = scanf("%d", &valeur);
    fpurge(stdin);
    if(nScan == 1)
    {
    	/*OK*/
    }
    else
    {
    	/*Erreur*/
    }

    Et si tu veux demander juste une touche en ignorant le reste de la ligne, tu fais ça:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int carac;
    /*Demande de presser une touche*/
    printf("Quitter? (O/N) : ");
    fflush(stdout);
     
    /*Lecture de la touche*/
    carac = getchar();
    if(carac!='\n')
    	fpurge(stdin);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Verification d'un carré magique.
    merci

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    En ce qui concerne l'erreur de segmentation, elle vient de la lecture/écriture hors des tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (i=0;i<=TAILLE_CARRE;i++)
    {
       for (j=0;j<=TAILLE_CARRE;j++)
      {
    ....
         scanf("%d",&tab[i][j]);
      }
    }
    Les tableaux sont de TAILLE_CARRE éléments. les indces peuvent varier de 0 à TAILLE_CARRE-1.
    Et de même pour le code qui suit.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Verification d'un carré magique.
    Bonjour

    merci beaucoup pour ta réponse cependant je ne vois pas comment exactement comment l'appilqué car dans mon code si je ne me trompe pas les indice i et j parte de 0 et arrivé a 4 sorte de la boucle ce qui rempli les position :

    0 0
    1 0
    2 0
    3 0
    0 1
    1 1
    2 1
    3 1
    0 2
    1 2
    2 2
    3 2
    0 3
    1 3
    2 3
    3 3

    SI je ne me trompe pas les indices pointent vers les bonne position non ? enfin je ne comprend pas bien meme si je sais que la régle que tu as énoncé est vrai.

  10. #10
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Le define TAILLE_CARRE vaut 3

    En faisant int tab[TAILLE_CARRE][TAILLE_CARRE], tu definie un tableau a deux dimension dont les indice varierons de 0 à 2 (TAILLE_CARRE - 1)

    Tu aura donc cela :

    0,0 | 0,1 | 0,2
    ----+----+----
    1,0 | 1,1 | 1,2
    ----+----+----
    2,0 | 2,1 | 2,2

    Le probleme, c'est qu'en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (i=0;i<=TAILLE_CARRE;i++)
    {
       for (j=0;j<=TAILLE_CARRE;j++)
      {
    ....
         scanf("%d",&tab[i][j]);
      }
    }
    ton i va aller jusqu'3 ! a cause du =
    Retourne cela comme tu veux, mais la case 0,3 1,3 ou quelque soit n'existe pas !
    De meme pour ton j !

    En realité, cette boucle parcours un tableau de la forme

    0,0 | 0,1 | 0,2 | 0,3
    ----+----+----+----
    1,0 | 1,1 | 1,2 | 1,3
    ----+----+----+----
    2,0 | 2,1 | 2,2 | 2,3
    ----+----+----+----
    3,0 | 3,1 | 3,2 | 3,3



    Tout ce qui est rouge est en dehors du tableau que tu as definie avec TAILLE_CARRE.
    Donc pour bien parcourir le tableau que tu as créer, il faut faire tout simplement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (i=0 ; i<TAILLE_CARRE ; i++)
       for (j=0 ; j<TAILLE_CARRE ; j++)
      {
    ....
         scanf("%d",&tab[i][j]);
      }

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Merci Beaucoup
    merci beaucoup a toi je n'avais pas saisi enfait merci infiniment ^^!

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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