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 de valeur retournée et seg fault


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 14
    Points : 14
    Points
    14
    Par défaut probleme de valeur retournée et seg fault
    Salut a tous,

    Je realise une fonction qui traite un char** et me retourne 2 parametres le premier un entier qui me donne le nombre de char* contenu dans mon deuxieme parametre de retour char**

    voici le prototype de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int getPath(int argc, char** argv, char** path);
    path est mon deuxieme parametre de retour
    Mais quand je veux faire un print de path[i]b dans ma fonction main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     sizePath = getPath(argc, argv, allPath);
      for(i=0;i<sizePath;i++){
        printf("%s", allPath[i]);}
    ma console m'affiche segmentation fault.

    Pour info je vous met l'implementation de getPath()
    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
     
    int getPath(int argc, char** argv, char** path)
    {
      int i, j = 0, count = 0;
      int sizePath;
     
      /*recherche du nombre de chemins passe en parametre*/
      /*on commence a argv[1][] car argv[0][] contient le nom
        du programme ce parametre ne nous interesse pas */
     
      for(i = 1; i < argc; i++)
        {
          if(argv[i][0] == '-')
    	count++;
        }
      if(count!=0){
      /*initialisation du char** */
      /*le char** est un tableau a 2 dimension */
      /*la 1ere contient des pointeurs sur des char* */
      /*la 2nde contient des pointeurs sur char */
      path = (char**)malloc(sizeof(char*)*count);
      for(i = 0; i < count; i++)
        path[i] = (char*)malloc(sizeof(char)*MAXBUFFER);
     
      /*argc-count = x*/
      for(i=1; i < count+1; i++)
        {
          sizePath = strlen(argv[i]);
          for(j=2; j < sizePath; j++)
    	{
    	  path[i-1][j-2] = argv[i][j];
    	}
          path[i-1][sizePath-2] = '\0';
          printf("%s\n", path[i-1]);
          path[i-1] = standardizeString(path[i-1]);
                printf("%s\n", path[i-1]);
        }}
      return count;
    }
    merci d'avance pour votre aide

  2. #2
    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 Re: probleme de valeur retournée et seg fault
    Citation Envoyé par florent_de_brest
    Salut a tous,

    Je realise une fonction qui traite un char** et me retourne 2 parametres le premier un entier qui me donne le nombre de char* contenu dans mon deuxieme parametre de retour char**

    voici le prototype de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int getPath(int argc, char** argv, char** path);
    Pose toi la question suivante.

    Pourquoi le prototype de malloc() est-il
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *malloc(size_t size);
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void malloc(void *p, size_t size);
    ?

    Quand tu auras la réponse à cette question tu sauras pourquoi ton code ne peut pas fonctionner.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    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
    Autre manière d'expliquer (si j'ai bien compris ce que veux dire Emmanuel), le passage en C se fait par valeur, c'est à dire qu'au sortir de la fonction "int getPath(int argc, char** argv, char** path) ", la valeur des arguments argc, argv et path est inchangée, donc la modification de path dans le code n'est pas répercutée dans la fonction appelante, d'où le segfault.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 14
    Points : 14
    Points
    14
    Par défaut d'accord
    en gros mes variables sont constantes.
    ca devrait fonctionner si je retourne une structure ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef _struct{
      int sizepath;
      char** path;
    }

  5. #5
    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 Re: d'accord
    Citation Envoyé par florent_de_brest
    en gros mes variables sont constantes.
    ca devrait fonctionner si je retourne une structure ?
    Si elle est codée correctement, tu augmentes tes chances !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct pathlist
    {
      int sizepath;
      char** path;
    };
    tu peux aussi passer l'adresse de la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       struct pathlist x;
     
       f(&x);
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       int f(struct pathlist *p)
       {
       }
    par exemple...
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 14
    Points : 14
    Points
    14
    Par défaut merci
    le probleme est reglé, je passe par des structures.

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

Discussions similaires

  1. Problem valeur retourne = NULL
    Par chlebta*tsotsi dans le forum PL/SQL
    Réponses: 2
    Dernier message: 14/05/2011, 18h04
  2. Probleme Valeur retournée par Struts
    Par issam_ovic dans le forum Struts 1
    Réponses: 0
    Dernier message: 14/04/2010, 01h05
  3. probleme de type et de valeur retournée
    Par étoile de mer dans le forum Débuter
    Réponses: 2
    Dernier message: 22/12/2009, 10h21
  4. Réponses: 4
    Dernier message: 22/01/2009, 04h44
  5. select avec un nombre limité de valeurs retournées
    Par felix79 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/12/2004, 15h16

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