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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    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?

  3. #3
    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 : 62
    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
    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
    .

  4. #4
    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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    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++

    +

  5. #5
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 44

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

  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 : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    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
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 confirmé
    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
    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) :

+ 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, 12h35
  2. Réponses: 8
    Dernier message: 14/12/2007, 17h12
  3. [WinCE5.0] Dll-Appel de fonction avec pointeur
    Par Bart_lx dans le forum Windows
    Réponses: 11
    Dernier message: 11/12/2007, 11h43
  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, 19h39
  5. Problème de gestion de chaînes avec pointeur
    Par LorDjidane dans le forum C
    Réponses: 18
    Dernier message: 19/10/2005, 15h40

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