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 :

chaine de caractères , erreur segmentation


Sujet :

C

  1. #1
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 68
    Points
    68
    Par défaut chaine de caractères , erreur segmentation
    Bonjour,
    je fais un ptit programme qui convertit un entier décimal en une chaine de caractès "binaire"

    ex: 10 sera convertit en 0000 1010

    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
     
     
     
    char  * octet;
    char * binaire;
     char * conversion (int decimal);
     
     
    int main ()
    {
    binaire=conversion(10); // je met dans la chaine binaire le résultat de la conversion du 10
    }
     
     
     char * conversion (int decimal)
    {
    // je remplis ici ma chaine octet  en faisant des octet[i]='0'; ou octet[j]='1'; et j'oublie pas //le octet[8]='\0'; pour le dernier caractère
     
    return octet // je retourne ma chaine octet
    Mais j'ai une erreur segmentation fault..

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si tu montrais le code en détail de cette fonction, ce serait beaucoup mieux. Je soupçonne l'utilisation d'un bufer interne à la fonction ...
    PS J'ai mal lu, ta chaîne globale octet (ça n'est déjà pas beau) n'est pas initialisée, (c'est encore pire).

  3. #3
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 68
    Points
    68
    Par défaut
    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
     
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
     
    int reste;
    char  * octet;
    char * chaine;
    char * conversion (int decimal);
     
     
    int main ()
    {
    chaine=conversion(10);
    }
     
     
     char * conversion (int decimal)
    {
       int i,j,l;
     
     
        l=128;// l définit le premier seuil 128
     
     
           for (i=0;i<8;i++) // initialisation de la chaine de caractere octet
              {
                  octet[i]='0';
              }  
    	octet[8]='\0';
     
     
    if (decimal != 0)
    {
     
     
       reste=decimal%2;
     
      if (reste ==1)
    {
          octet[7]='1';
      decimal=decimal-1;
    }
     
       else octet[7]='0';   
     
        i=0;
     
     
    while ( decimal!=0)
    {
          if (decimal<l)
          {
              octet[i]='0';
              l=l/2;
              i++;
          }
     
            if (decimal>l)
          {
              octet[i]='1';
    	   decimal=decimal -l;
              l=l/2;
              i++;
          }
     
                 if (decimal==l)
          {
              octet[i]='1';
              i++;
              for (j=i;j<8;j++)
              {
                  octet[j]='0';
              }    
    		octet[8]='\0';
     
                       decimal=0;
          }
    }         
     
     
    }
     
    return octet;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par psgman113
    voici mon code
    Ne compile pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:7: warning: function declaration isn't a prototype
    main.c: In function `conversion':
    main.c:31: error: `reste' undeclared (first use in this function)
    main.c:31: error: (Each undeclared identifier is reported only once
    main.c:31: error: for each function it appears in.)
    Process terminated with status 1 (0 minutes, 2 seconds)
    3 errors, 1 warnings
    Sinon, ce code me parait atrocement compliqué...

    Je vais te révéler un Grand Secret : "En informatique, les données sont codées en binaire".

    Donc, avec une combinaison astucieuse de décalages (>>, <<) et de masquage (&), tu devrais déterminer si les bits valent 0 ou 1 et afficher '0' ou '1' en conséquence...

  5. #5
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 68
    Points
    68
    Par défaut
    voilà j'ai modifié mes ptits oublis dans ma copie
    Ok pour le codage en binaire qui doit être plus facile mais comme j'ai passé un peu de temps,
    prenons mon code


    En fait à la base je voudrais retourner ce tableau ou cette chaine de caractère à partir d'une fonction,
    J'ai utilisé une chaine de caractères car je n'arrive pas à retourner un tableau d'entiers.

    merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Les variables globales, ce n'est pas très bon.

    Où sont les réservations mémoires pour tes pointeurs ?

    Sans oublier leur libération, ensuite.

    Et comme te l'a dit Emmanuel, côté algorithme, c'est plutôt compliqué.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par psgman113
    Ok pour le codage en binaire qui doit être plus facile mais comme j'ai passé un peu de temps,
    prenons mon code
    Pas d'accord. L'essence de l'informatique, c'est pas le codage, qui un jour ou l'autre sera totalement automatisé (ou fait par des indiens, voire des chinois...), mais c'est la recherche du meilleur algorithme. Alors concentre toi plutôt là dessus, parce que c'est la base et c'est là qu'on développe ses connexions neuronales.

    Il est inutile de perdre du temps à coder un algorithme faux ou inefficace.

  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 fait à la base je voudrais retourner ce tableau ou cette chaine de caractère à partir d'une fonction,
    J'ai utilisé une chaine de caractères car je n'arrive pas à retourner un tableau d'entiers.
    C'est normal, on ne peut pas retourner un tableau.

    Il faut SUPPRIMER les variables globales qui sont des ennemies perfides et dangereuses. Le code devrait être du style (indépendamment des problèmes d'algo dans la fonction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void conversion (int decimal, char * octet );
    int main ()
    {
     char Octet[9];
     conversion(10, Octet);
    }
     
     void conversion (int decimal, char * octet )
    {
      int reste;
    ...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par diogene
    Le code devrait être du style (indépendamment des problèmes d'algo dans la fonction)
    Comme je dis souvent (un peu trop...) 'inutilement complexe' et 'il manque 'l'essentiel'...
    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
     
    int conversion (char * octet, size_t size, int valeur)
    {
      int err;
      int reste;
     
    <...>
     
      return err;
    }
     
    int main (void)
    {
       char chaine[9];
       conversion (chaine, sizeof chaine, 10);
    }
     
    ...

  10. #10
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 68
    Points
    68
    Par défaut
    int conversion (char * octet, size_t size, int valeur)
    {
    int err;
    int reste;

    <...>

    return err;
    }
    Pour toi, la fonction conversion retourne un entier??
    Elle devrait plutot retourner un pointeur sur une chaine de caractères


    et je dois mettre quelque chose devant
    conversion (chaine, sizeof chaine, 10);
    car conversion retourne quelque chose

    Je devrais plutot faire un truk du genre

    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
     
     
    char * conversion (char * octet, size_t size, int valeur)
    {
      char * err;
      int reste;
     
    <...>
     
      return err;
    }
     
    int main (void)
    {
    char * chaine_finie;
     
     char chaine[9];
    chaine_finie=   conversion (chaine, sizeof chaine, 10);
    printf("%d",chaine_finie);
    }

    Après c'est vrai qu'il faut allouer de l'espace

    est ce mieux?
    Merci

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int conversion (char * octet, size_t size, int valeur)
    octet est un pointeur vers une chaine de caractere (enfin vers un caratere), en modifiant la valeur pointé, la chaine passe en parametre est modifiee aussi (chaine).

    le retour, c'est juste pour indiquer si le traitement s'est bien passé et sinon quelle est l'erreur

  12. #12
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 68
    Points
    68
    Par défaut
    Et comment tu l'affiches la chaine de caractère dans le main?
    le int devant la fonction me choque

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par psgman113
    Pour toi, la fonction conversion retourne un entier??
    A ton avis 'err', ça veut dire quoi ?
    Elle devrait plutot retourner un pointeur sur une chaine de caractères
    C'est un choix, mais il conduit à de mauvaises pratiques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       printf ("%s\n", converstion(chaine, sizeof chaine, -1));
    Si il vaut NULL, tu fais quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Je devrais plutot faire un truk du genre
    Oui, mais il faut tester chaine_finie avant de l'utiliser. Et "%d" pour une chaine, ça va pas trop le faire... Manque un '\n'...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main (void)
    {
       char chaine[9];
       char *chaine_finie =  conversion (chaine, sizeof chaine, 10);
       if (chaine_finie != NULL)
       {
          printf ("%s\n", chaine_finie);
       }
       return 0;
    }
    Il est plus clair de séparer le rôle de chacun et considérer le retour comme un code d'erreur 0=OK 1=ERR.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main (void)
    {
       char chaine[9];
       int err =  conversion (chaine, sizeof chaine, 10);
       if (!err)
       {
          printf ("%s\n", chaine);
       }
       return 0;
    }
    Comme souvent, les solutions les plus simples sont les meilleures...

  14. #14
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 68
    Points
    68
    Par défaut
    Merci pour l'aide , j'ai trouvé

  15. #15
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    qui un jour ou l'autre sera totalement automatisé (ou fait par des indiens, voire des chinois...)
    C'est pas la même chose?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Pouic
    C'est pas la même chose?
    Les indiens et les chinois ? Non. Les indiens sont plus 'software' et les chinois plus 'hardware' (mais ça pourrait changer).

    Ils devraient de partager le monde de la production informatique dans les 10 ans qui viennent (avec quelques grosses miettes pour le Brésil).

    Pour survivre, les EU et l'Europe doit s'accrocher à leur savoir faire, c'est à dire la définition et la conception.

    Le gourou à parlé, vous pouvez reprendre une activité normale...

  17. #17
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Les indiens et les chinois ?
    Non. Les indiens sont plus 'software' et les chinois plus 'hardware' (mais ça pourrait changer).

    Ils devraient de partager le monde de la production informatique dans les 10 ans qui viennent (avec quelques grosses miettes pour le Brésil).

    Pour survivre, les EU et l'Europe doit s'accrocher à leur savoir faire, c'est à dire la définition et la conception.

    Le gourou à parlé, vous pouvez reprendre une activité normale...
    Nan, je voulais dire "automatiser la chose" et "faire développer par des indiens ou des chinois"

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Pouic
    Nan, je voulais dire "automatiser la chose" et "faire développer par des indiens ou des chinois"
    Je ne me permet pas de comparer les indiens et les chinois à des machines. (Des Cylons Eeek !)

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 31/05/2013, 15h57
  2. Réponses: 11
    Dernier message: 30/12/2012, 17h22
  3. Réponses: 3
    Dernier message: 30/10/2012, 17h51
  4. Réponses: 4
    Dernier message: 20/03/2009, 11h15
  5. [excel] Insérer l'erreur #valeur# a une chaine de caractères
    Par law56100 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/02/2009, 14h52

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