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 de segmentation


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 118
    Points : 419
    Points
    419
    Par défaut Problème de segmentation
    Bonjour à tous !

    je suis actuellement en train de coder un petit soft pour ranger un tableau de chaine alphabétiquement, donc j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int i=0;
    char* tableau[7]={"bateau","zebre","roue","fauteuil","voiture","camion","ruche"};
    for (i=0;i<7;i++) strupr(tableau[i]);
    qsort(tableau,7,sizeof(char*),strcmp);
    le problème c'est qu'avec la compilation sous gcc, windows me retourne une erreur de violation de de mémoire au niveau de strupr(). Après deux trois petits tests, il semble que les chaines contenues dans 'tableau' sont stockées dans la section '.text' de l'éxecutable, laquelle est seulement disponible en lecture, ce qui cause l'ereur.

    Donc ce que j'aimerais savoir c'est si on peut indiquer a gcc de mettre ces chaines dans la section '.data' pour qu'elles soient modifiables et comment on peut le faire.

    merci pour vos réponses
    <noscript>
    <script type="text/javascript">alert("Votre navigateur ne supporte pas JavaScript");</script>
    </noscript>

    [Batch] [Dos9]

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    je ne connais pas strupr, cette fonction ne fais pas partie de la libc standard ... mais pourquoi n'utilises-tu pas strcasecmp qui effectue une comparaison qui ne prend pas la casse en compte ?
    Attention néanmoins car tu risques de te retrouver face à de drôle d'effets si tes chaines utilisent des caractères accentués (encodage utilisé, caractères multibyte, dépend de la localisation).

    Il va quand même falloir écrire une fonction de comparaison, car qsort passera un paramètre de type char**.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 118
    Points : 419
    Points
    419
    Par défaut
    hello !

    merci c'est standart strcasecmp()? pour strupr c'est pas ansi mais posix je crois.
    pour l'erreur de syntaxe de la fonction qsort je m'en était apperçu.

    c'est presque résolu mais est-ce qu'il existe une variante comme strncasemap()

    @+
    <noscript>
    <script type="text/javascript">alert("Votre navigateur ne supporte pas JavaScript");</script>
    </noscript>

    [Batch] [Dos9]

  4. #4
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    re-,

    ça va dépendre de la libc que tu utilises en fait. Tu es sous windows/linux/mac ?
    Si tu utilises la gnu libc tu as la référence sur http://www.gnu.org/software/libc/manual/.

    strncasemap ??? que fait cette fonction ?
    sinon il y a un strncasecmp dans la gnu libc.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 118
    Points : 419
    Points
    419
    Par défaut
    re !

    Citation Envoyé par kwariz Voir le message
    strncasemap ??? que fait cette fonction ?
    sinon il y a un strncasecmp dans la gnu libc.
    désolé, je crois que mon clavier à fouché je voulais dire strncasecmp()

    edit: strncasecmp et strcasecmp sont disponible sous windows mais en tant que surcouche de strcmpi. De toutes façon aucune des trois ne sont définies par posix ou ansi donc

    merci beaucoup
    <noscript>
    <script type="text/javascript">alert("Votre navigateur ne supporte pas JavaScript");</script>
    </noscript>

    [Batch] [Dos9]

  6. #6
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    ok ... mais de rien

    À propos tu ne peux modifier les string litterals, il faut les allouer dynamiquement.

  7. #7
    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
    ....il faut les allouer dynamiquement.
    Ce n'est pas une obligation. Ce qui est nécessaire, c'est que les chaines soient dans des tableaux non constant et d'avoir un tableau de pointeurs sur ces chaines
    Par exemple :
    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
    #include <stdlib.h>
    #include <string.h>
    int qsortcmp( const void*a, const void*b)
    {
      return strcmp(*(const char**) a,*(const char**) b);
    }
    //----------------------------------------------------
    int main(int argc, char* argv[])
    {
      int i=0;
      static char bat[] = "bateau";    // static ou sinon les déclarer en global
      static char zeb[] = "zebre";     // (pour permettre l'initialisation 
      static char rou[] = "roue";      // du tableau de pointeurs "tableau")
      static char fau[] = "fauteuil";
      static char voi[] = "voiture";
      static char cam[] = "camion";
      static char ruc[] = "ruche";
      char* tableau[] = {bat,zeb,rou,fau,voi,cam,ruc};
      int dim = sizeof tableau/sizeof *tableau; // nombre de pointeurs de "tableau"
     
      for (i=0;i<dim;i++) strupr(tableau[i]);
      qsort(tableau,dim,sizeof(char*),qsortcmp); // il faut une fonction d'adaptation pour le tri par strcmp
      return 0;
    }
    //----------------------------------------------------
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/11/2007, 18h44
  2. Problème java segmentation
    Par irdaa dans le forum Mandriva / Mageia
    Réponses: 1
    Dernier message: 28/03/2007, 08h24
  3. [Socket SSL] problème de "Segmentation fault"
    Par jesus144 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 09/03/2007, 19h50
  4. Problème de segmentation.
    Par Gryzzly dans le forum C
    Réponses: 12
    Dernier message: 27/12/2005, 11h02
  5. Problème de segmentation ?
    Par julson dans le forum Assembleur
    Réponses: 2
    Dernier message: 23/12/2004, 18h33

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