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 retour de fonction avec pointeurs.


Sujet :

C

  1. #1
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 981
    Points
    2 981
    Par défaut Problème de retour de fonction avec pointeurs.
    Bonjour,

    J'ai fais une fonction qui manipule un tableau de pointeur de chaine de caractère.

    Donc je passe en argument de la fonction ce fameux tableaux et je le modifie dans le fonction. Une partie du 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
    int pregMatch(const char *pattern, const char *request, char **result)
    {
            ...
    	if ((result = malloc(sizeof(regmatch_t) * numMatch)) == NULL)
    	{
    		return EXIT_FAILURE;
    	}
            ...
     
    	if (...)
    	{
    	}
    	else
    	{
    		for (i = 0; i < numMatch; i++)
    	    {
    			....
    			if ((result[i] = malloc(length)) == NULL)
    			{
    				return EXIT_FAILURE;
    			}
                            ...
    		}
    	}
     
            /* Ce code affiche bien les chaine de caractères que je veux */
    	for (i = 0; i < numMatch; i++)
            {
    		printf("%s\n", result[i]);
    	}
     
    	return numMatch;
    }
    L'appel de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
             char *result = NULL
     
             if((rc = pregMatch(pattern, string, &result)) == NOK)
    	{
    		...
    	}
     
    	for (i = 0; i < rc; i++)
    	{
                    /* Pas moyen de récupérer les chaine de caractère ici */
    		printf("%d : %s\n", i, ????result??????);
    	}
    Je n'arrive pas a récupéré les chaine de caractère en dehors de la fonction alors que dedans ca marche nikel. Que mettre à la place des ????????? (j'ai tout essayé mais j'ai pas trouvé ). A chaque fois j'ai une erreur de segmentation quand j'affiche les chaine de caractère en dehors de ma fonction.



    Yoshio

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Yoshio Voir le message
    J'ai fais une fonction qui manipule un tableau de pointeur de chaine de caractère.
    Tu voulais dire un tableau de chaine ou un pointeur de chaine je suppose?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    En attente de confirmation mail
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Points : 348
    Points
    348
    Par défaut
    C'est un tableau dynamique de chaine de caractères ou seulement une chaîne de caractère ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je pense que c'est plutôt cela qu'il faut faire lors du malloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    if ((*result = malloc(sizeof(regmatch_t) * numMatch)) == NULL)
    ...
    Et même je le ferait en 2 lignes pour plus de clarté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    *result = malloc(sizeof(regmatch_t) * numMatch));
    if (*result == NULL)
    ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 508
    Points
    5 508
    Par défaut
    Je vérifierais même au préalable que result ne vaut pas NULL avant de déréférencer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /* -tc- validation des arguments */
    if (result != NULL)
    {
        /*...*/
        *result = malloc(sizeof(regmatch_t) * numMatch));
        if (*result == NULL)
        {
            /* ... */
        }
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 981
    Points
    2 981
    Par défaut
    Citation Envoyé par JeromeBcx Voir le message
    C'est un tableau dynamique de chaine de caractères ou seulement une chaîne de caractère ?
    J'ai un tableau de pointeur et les pointeur pointe sur une chaine de caractères. (Enfin du moins c'est ce que j'ai essayé de faire )

    Merci pour ta solution ram_0000, ca marche un ptit peu mieux

    Pour lire les chaine de caractère en dehors de la fonction vous feriez quoi ?
    result[i] ca passe pas, result + i c'est pas bon non plus, ...

  7. #7
    En attente de confirmation mail
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Points : 348
    Points
    348
    Par défaut
    Citation Envoyé par Yoshio Voir le message
    Pour lire les chaine de caractère en dehors de la fonction vous feriez quoi ?
    result[i] ca passe pas, result + i c'est pas bon non plus, ...

    Dans ton cas, tu ne devrais pas avoir de différences entre inter et extra fonction.

    Ce n'est qu'une proposition mais je déclarerais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char** result = NULL; //Un tableau dynamique d'une chaine de caractères dynamique.
    Pour l'appel à ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((rc = pregMatch(pattern, string, result)) == NOK)
    Pour l'allocation d'un tableau de chaine en C, je ne me souviens pas de la syntaxe mais de mémoire, il faut:
    Allouer le tableau de pointeurs, puis pour chaque pointeurs, allouer la mémoire des chaînes de caractères.

    Enfin pour l'affichage, la méthode sera la même en inter/extra du type
    Bon courage

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Les notes d'Emmanuel peuvent utiles : http://emmanuel-delahaye.developpez....difie_variable
    Même si sur ce chapitre, c'est quand même un poil trop succint...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    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
    Si tu veux fabriquer dynamiquement un tableau de chaînes de caractères, le type de la variable result doit être char** (du coté appel)
    La fonction pregMatch construit ce tableau, donc doit être apte à modifier cette variable result. Il faut donc passer son adresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int pregMatch(const char *pattern, const char *request, char *** result)
    {
      if ((*result = malloc(sizeof(regmatch_t) * numMatch)) == NULL)
    (Là, c'est curieux, car tu devrais avoir sizeof(char*) dans le malloc)

    Pour créer les chaînes du tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (((*result)[i] = malloc(length)) == NULL)
    (*result doit être mis entre parenthèses)

    et appeler la fonction par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((rc = pregMatch(pattern, string, &result)) == NOK)....
    Pour sortir les chaînes (du coté appel) :
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  10. #10
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 981
    Points
    2 981
    Par défaut
    diogene c'est presque ça

    J'ai fait comme tu as dit et ça marche plus ou moins.

    Ça m'affiche dans la fonction :
    azerty12345
    azerty
    123456
    Et hors de la fonction :
    azerty12345
    12345
    -
    Résultat complètement incompréhensible, surtout le - je me demande ce qu'il fou la.

  11. #11
    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 faudrait un peu plus de code pour comprendre
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  12. #12
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 981
    Points
    2 981
    Par défaut
    J'ai utilisé une bonne vieille méthode : le ctrl-a/del et on recommence

    Va savoir ce que j'ai changé mais ca a l'air de marcher maintenant ... C'est dans ces moment que je me dit "C'est génial le C"

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

Discussions similaires

  1. problème de retour de fonction
    Par guiyomh dans le forum Débuter
    Réponses: 9
    Dernier message: 05/10/2008, 13h35
  2. Réponses: 8
    Dernier message: 14/12/2007, 18h12
  3. [WinCE5.0] Dll-Appel de fonction avec pointeur
    Par Bart_lx dans le forum Windows
    Réponses: 11
    Dernier message: 11/12/2007, 12h43
  4. problème d'appel de fonction avec bind (en Tkinter)
    Par piotrr dans le forum Tkinter
    Réponses: 4
    Dernier message: 09/05/2007, 20h39
  5. Problème de gestion de chaînes avec pointeur
    Par LorDjidane dans le forum C
    Réponses: 18
    Dernier message: 19/10/2005, 16h40

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