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 :

probleme segmentation en convertissant une chaine en tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut probleme segmentation en convertissant une chaine en tableau
    bonsoir(encore lui diront certains lol) voila j ai de nouveau un problème.J ai un fichier conversion.c qui convertit une matrice en chaine de caractère et inversement.J ai fait un main qui appelle ses fonction la premiere fonctionne sans problème mais la deuxieme ne fonctionne pas j ai une erreur de segmentation.J ai mis beaucoup de printf dans la fonction pour reperer l erreur et j ai remarqué qu elle se situait a l affectation de la valeur dans le tableau(je l ai mis en commentaire dans le code cidessous).

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include"matrice.c"
     
    # define MAX 0
    //fonction puissance//////////////////////////
    int puissance(int nb,int exposant)
    {
    int resu=nb;
    int k=1;
     
    if (exposant>0)
    {
    for (k=1;k<exposant;k++)
    {
    resu=resu*nb;
    }
     
    }
    if (exposant==0)
    {
    resu=1;
    }
    return resu;
    }
    //fonction qui converti une matrice en chaine////////////////////////////////
     
    char* mattoc(matrice *mat)
    {
    char* resultat;
    char buf[1];
    char final[1024];
    resultat="\0";
    int i,j;
    final[1024]="\0";
     
     
     
     
    for (i=0 ; i<(*mat).nbl ;i++)
    {
    	for (j=0 ; j<(*mat).nbc ;j++)
    	{
     
    		//printf("%d\n",j);
    		sprintf(buf,"%d",(*mat).tab[i][j]);
    		strcat(final,buf);
    		if (j!=2){strcat(final,",");}
    	}
    		strcat(final,"/");
    }
    resultat=final;
    return resultat;
    }
    //fonction qui converti une chaine en matrice////////////////////////////////
    matrice *ctomat(char *final)
    {
    matrice *mat;
    char buffer;
    int nblu=0;
    int compt=0;
    int nbl=0;
    int nbc=0;
    int nb=0;
    int n;
    int k=0;
    int i=0;
    int j=0;
    char temp[500]="\0";
    printf("on rentre dans la fonction\n");
    strcpy(temp,final);
    printf(" le chaine a converir est %s\n",temp);
    printf("on fait %d\n",strlen(temp));
    while(compt<strlen(temp))
     {
    	printf("on rentre dans while\n");
    if ( (temp[compt]!=',') && (temp[compt]!='/') ) 
    	{
    		printf("on rentre dans 1er if\n");
    		nblu++;
     
    	}
     
      if ( (temp[compt]==',') || (temp[compt]=='/') )
    	{
     
    	printf("on rentre dans 2ème if\n");
    	for(k=compt-nblu;k<compt;k++)
    		{
     
    			nblu--;
    			buffer=temp[k];
    			n = strtol (buffer, NULL, 10);
    			printf("on converti buffer vers n\n");
    			printf(" n vaut %d\n",n);
    			nb=nb+(n*puissance(10,nblu));
    			printf(" nb vaut %d\n",nb);
     
    		}
    		printf("valeur de nbl %d\n",nbl);
    		printf("valeur de nbc %d\n",nbc);
    		mat->tab[nbl][nbc]=nb;//l erreur est ici
    		//printf("%d\n",nb);
    		nb=0;
    		nbc++;
     
    	}	
    if (temp[compt]=='/') 
    	{
    	nbl++;
    	(*mat).nbl=nbl;
    	nbc=0;
    	}
    compt++;
     
    }
    return mat;
    }
    Je sais que c est un algo largement perfectible mais j attend si possible une correction sur mon erreur et pas sur le fonctionnement general du programme(à moins que ce soit ça le problème).Si je dois mettre les autre fichiers et le main dites le moi je ne voulais pas saturé la page.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sneb5757
    mais j attend si possible une correction sur mon erreur
    Et moi, j'attends un code qui compile...
    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
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:4:20: matrice.c: No such file or directory
    main.c:29: error: syntax error before '*' token
    main.c:30: warning: function declaration isn't a prototype
    main.c: In function `mattoc':
    main.c:34: warning: assignment discards qualifiers from pointer target type
    main.c:36: warning: assignment makes integer from pointer without a cast
    main.c:41: error: `mat' undeclared (first use in this function)
    main.c:41: error: (Each undeclared identifier is reported only once
    main.c:41: error: for each function it appears in.)
    main.c:48: warning: implicit declaration of function `strcat'
    main.c: At top level:
    main.c:57: error: syntax error before '*' token
    main.c:58: warning: return type defaults to `int'
    main.c: In function `ctomat':
    main.c:59: error: `matrice' undeclared (first use in this function)
    main.c:59: error: `mat' undeclared (first use in this function)
    main.c:72: warning: implicit declaration of function `strcpy'
    main.c:74: warning: implicit declaration of function `strlen'
    main.c:75: warning: comparison between signed and unsigned
    main.c:93: warning: assignment makes pointer from integer without a cast
    main.c:94: warning: passing arg 1 of `atoi' from incompatible pointer type
    main.c:68: warning: unused variable `i'
    main.c:69: warning: unused variable `j'
    Process terminated with status 1 (0 minutes, 3 seconds)
    8 errors, 12 warnings
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       char *buffer;
       char temp[500] = "\0";
                buffer = temp[k];
                n = atoi (&buffer);
    Ce code n'a aucun sens. Si tu veux l'adresse, tu utilises &temp[k] ou tout simplement temp + k
    Pourquoi & ? buffer est déjà un pointeur... atoi() est dépassée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                n = strtol (buffer, NULL, 10);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       char final[1024];
       resultat = "\0";
       int i, j;
       final[1024] = "\0";
    Horrible !
    L'indice 1024 est invalide (0..1023)
    Pour assigner une chaine, on utilise strcmp().
    On sait assigner une caractère :
    mais je ne suis pas sûr que ce soit ça que voulais...

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    hé zut c est vrai faut que je mette les autre parties aussi sinon ça peut pas marcher hop hop le temps de retourner sous linux.

    strcmp?c est pas strcpy?

    c est pas l adresse que je voulais mais le contenu de temp[k] pour faire un traitement sur ce caractère la variable intermediaire est en effet inutile

  4. #4
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Citation Envoyé par sneb5757

    c est pas l adresse que je voulais mais le contenu de temp[k] pour faire un traitement sur ce caractère la variable intermediaire est en effet inutile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *buffer;
       char temp[500] = "\0";
                buffer = temp[k];
                n = atoi (&buffer);
    oui mais buffer est un pointeur sur char !il faudrait alors faire *buffer = temp[k]
    mais ne pas oublier d'alouer un espace memoire pour buffer avant...
    ou alors plus simplement definir beffer de cette maniere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[TAILLE_DU_BUFFER]

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Comme l'a dit Emmanuel, atoi() est "deprecated" et à la place il est d'usage dorénavant d'utiliser la fonction strtol().

    Une principale différence, atoi() ne détecte pas d'erreur...


  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    effectivement en faite j avais pas fait attention. bon je met les autres fichiers pour que ça puisse compiler.

    matrice.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_ELEM 20
    struct  matrice
     {
         int tab[NB_ELEM][NB_ELEM];
          int nbl;
          int nbc;
    };
     
    typedef struct matrice matrice;
     
     
     
     
     
     void init_mat(matrice *mat)
     {   
            int i,j,l,c;
     
        printf("saisir le nombre de ligne\n");
         scanf("%d",&l);
         printf("saisir le nombre de colonne\n");
         scanf("%d",&c);
     
          (*mat).nbl=l;
          (*mat).nbc=c;
     
         for(i=0;i<(*mat).nbl;i++)
         {
     
     
                         for (j=0;j<(*mat).nbc;j++)
                         {
     
                          (*mat).tab[i][j]=0;
                          }
     
         }
     
     
    }
     
    void affiche_mat(matrice * mat)
    {
         int i,j;
     
     
                     for(i=0;i<(*mat).nbl;i++)
     
         {
                         for (j=0;j<(*mat).nbc;j++)
                         {
                          printf("%4d ",mat->tab[i][j]);
                          printf("|");
                          }
                          printf("\n");
         } 
    }
     
     void saisir_mat(matrice  *mat)
    {
    int i,j;
    for(i=0;i<(*mat).nbl;i++)
    {
                      for (j=0;j<(*mat).nbc;j++)
                         {
                          scanf("%d",&(*mat).tab[i][j]);
                          printf("à saisi");
                          system("clear");
                          affiche_mat(mat);
     
                          }                      
     
    }
    }
    le main test.c
    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
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NB_ELEM 20
     
    #include"conversion.c"
     
     
    main()
    {
    matrice m1;
    matrice *m2;
    char* m;
    init_mat(&m1);
    saisir_mat(&m1);
    m=mattoc(&m1);
    printf(" le tableau converti en chaine est %s\n",m);
    m2=ctomat(m);
    affiche_mat(&m2);
    }

    J ai remplacer le pointeur sur buffer par un char ça marche tout aussi bien en faite.

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    j ai cherché mais j ai toujours cette erreur de segmentation y a vraiment personne qui peut m aider?

    est ce que je dois changer quelques choses dans mes codes avant?ça ne compile pas?(chez moi ça compile mais j ai pu faire des erreurs de copier/coler).

    merci d avance

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/11/2007, 13h39
  2. Probleme Extraction Chiffre D' Une Chaine
    Par GUYSYS dans le forum Access
    Réponses: 14
    Dernier message: 21/03/2007, 00h10
  3. Réponses: 8
    Dernier message: 05/08/2006, 13h30
  4. Probleme de blanc dans une chaine
    Par Bahan dans le forum C
    Réponses: 22
    Dernier message: 25/07/2006, 16h38
  5. Probleme de coupe dans une chaine
    Par cryptorchild dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2005, 23h39

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