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 :

printf( "%s", const char*) -> segmentation fault


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Par défaut printf( "%s", const char*) -> segmentation fault
    Bonjour,

    J'ai une fonction dont le code est:
    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
    void Force::create_pair(const char *style, const char *suffix)
    {
      delete [] pair_style;
      if (pair) delete pair;
     
      int sflag;
      pair = new_pair(style,suffix,sflag);
     
      if (sflag) {
        char estyle[256];
        sprintf(estyle,"%s/%s",style,suffix);
        int n = strlen(estyle) + 1;
        pair_style = new char[n];
        strcpy(pair_style,estyle);
      } else {
        int n = strlen(style) + 1;
        pair_style = new char[n];
        strcpy(pair_style,style);
      }
    }
    Elle fonctionne bien. Elle est tiree du code de "Lammps" (http://lammps.sandia.org). Je veux rajouter un printf pour inspecter la fonction:
    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
    void Force::create_pair(const char *style, const char *suffix)
    {
    printf(" la valeur de style est %s \n",*style);
      delete [] pair_style;
      if (pair) delete pair;
    
      int sflag;
      pair = new_pair(style,suffix,sflag);
    
      if (sflag) {
        char estyle[256];
        sprintf(estyle,"%s/%s",style,suffix);
        int n = strlen(estyle) + 1;
        pair_style = new char[n];
        strcpy(pair_style,estyle);
      } else {
        int n = strlen(style) + 1;
        pair_style = new char[n];
        strcpy(pair_style,style);
      }
    }
    Mais j'obtiens lors de la compilation l'erreur:
    Segmentation fault
    A quoi cela est il du? la variable est elle vide?
    C'est possible car je veux justement verifier la valeur de cette variable, car on etudie le fichier d'entree du programme entier (lammps), mais j'aimerais savoir comment verifier que la variable est vide ou pas.

    J'ai voulu introduire une boucle de verification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const char* tmp01=*style;
    if (strlen(*tmp01)==0)
    {...}
    else
    {...}
    Et j'obtiens l'erreur:
    error: invalid conversion from 'char' to 'const char *'
    Quelqu'un peut il m'indiquer la syntaxe pour:
    1) afficher un const char* avec printf
    2) faire fonctionner la boucle conditionelle de verification de la taille
    3) m'aider

    Merci
    Oodbae

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    char* style est un char*
    *style est donc un char*

    Tu essayes de donner la valeur d'un char à un char*

    strlen a pour signature strlen(const char*), tu l'utilises avec un char

    %s du printf attend un char*, tu lui fournis un char : seg fault (à l'exécution et non à la compilation)

    btw: si tu es en C++, pourquoi ne pas utiliser std::string qui t'empêcherait de manipuler ce genre de pointeurs ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre actif
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Par défaut
    Salut bousk,

    merci pour la reponse.
    1) j'ai vu sur de nombreux forums que std::string serait plus simple, mais ce code n'est pas de moi (de l'universite de Sandia), donc je ne change pas la structure
    2) j'Ai refait quelques test, notamment avec ta correction sur le char/char*, merci, et l'erreur "segmentation fault" reapparait. J'ai l'impression que la ligne de code suivante provoque l'erreur "segmentation fault". Est-ce que c'est possible, sachant que le texte "the function..." est bien affiche, mais le programme bloque apres et refuse d'afficher un simple " printf("ww \n"); "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf(" the function Force::create_pair is being called with the arguments: \n");
    oodbae

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Salut

    A première vue je dirais tout d'abord ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf(" la valeur de style est %s \n",(rien)style);
    De plus si tu codes en c++ utilise std::string ça simplifie énormément la tâche !

    Enfin je crois que si tu testes strlen(qqch) avec qqch qui est un pointeur nul (ou sur aucune donnée), tu auras un segfault

    Ici de même qu'avec printf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const char* tmp01=*style;
    if (strlen((rien ici)tmp01)==0)
    {...}
    else
    {...}
    Avec évidemment tmp01 qui pointe sur quelque chose de correct ^^

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Lintel-oo Voir le message
    A première vue je dirais tout d'abord ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf(" la valeur de style est %s \n",(rien)style);
    De plus si tu codes en c++ utilise std::string ça simplifie énormément la tâche !
    Quand il faut faire du formatage de données numériques, c'est moins vrai.

Discussions similaires

  1. afficher unsigned char sans segmentation fault ?
    Par Battosaiii dans le forum C
    Réponses: 3
    Dernier message: 17/03/2006, 10h53

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