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 :

Passage de tableau multi-dimensionnel en paramètre de fonction


Sujet :

C

  1. #1
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut Passage de tableau multi-dimensionnel en paramètre de fonction
    Bonjour, la fonction suivante renvoit un tableau contenant des chaînes de caractères.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    char **my_ereg ( const char *regex, const char *str )
    {
        int         regcomp_options = 0;
        int         regexec_options = 0;
        regex_t     motif;
        int         error = 0;
     
        size_t      message_size = 0;
        char        *message = NULL;
     
        size_t      substr_count = 0;
        size_t      substr_size = 0;
        regmatch_t  *substr_match = NULL;
     
        char        *substr;
     
        char        **result;
     
        int i = 0;
     
        /* nothing to do if regular expression is empty */
        if ((regex == NULL) || (str == NULL))
            return NULL;
     
        /* Motif compilation */
        regcomp_options |= REG_EXTENDED;
     
        error = regcomp(&motif, regex, regcomp_options);
     
        /* Catch error */
        if (error != 0) {
            message_size = regerror(error, &motif, NULL, 0);
            message = malloc(message_size);
            regerror(error, &motif, message, message_size);
            error_printf(NON_FATAL, NULL, message);
            free(message), message = NULL;
            regfree(&motif);
            exit(EXIT_FAILURE);
        }
     
        /* Prepare sub-expressions */
        substr_count = motif.re_nsub + 1;
        substr_match = calloc(substr_count, sizeof(regmatch_t));
     
        /* Execute regular expression */
        error = regexec(&motif, str, substr_count, substr_match,
                        regexec_options);
     
        if (error != 0) {
            regfree(&motif);
            free(substr_match), substr_match = NULL;
            if (error == REG_NOMATCH)
                return NULL;
            else
                error_printf(FATAL, "regexec", NULL);
        }
     
        /* Allocating memory for results pointers */
        result = malloc(sizeof(*result) * (substr_count + 1));
     
        /* Parsing results */
        while (i < substr_count) {
            substr_size = substr_match[i].rm_eo
                        - substr_match[i].rm_so;
     
            *(result + i) = calloc( substr_size + 1,
                                    sizeof(**result) * (substr_size + 1));
            *(result + i) = strncpy(*(result + i),
                             str + substr_match[i].rm_so,
                             substr_size);
     
            i++;
        }
     
        /* Last result is NULL */
        *(result + i) = NULL;
     
        free(substr_match), substr_match = NULL;
     
        regfree(&motif);
     
        return result;
    } /* my_ereg() */
    Est-ce que quelqu'un a une idée pour faire la même chose en passant le tableau de chaînes en arguments (et mettre void en retour de fonction pour l'instant) ?

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Si tu alloues le tableau dans la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char **my_ereg ( const char *regex, const char *str, char ***res);
    Si tu alloues le tableau hors de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char **my_ereg ( const char *regex, const char *str, char **res);
    Jc

  3. #3
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut
    void my_ereg( const char *regex, const char *str, char **reg )

  4. #4
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    J'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char **my_ereg ( const char *regex, const char *str)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void my_ereg ( const char *regex, const char *str, char ***result )
    tous les 'return xxx' par 'return'

    mais :
    Jje ne sais pas comment faire l'appel. Avant, je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char **tab;
     
        tab = my_ereg(regex, str);
    Comment faire maintenant ?

    et j'ai des warnings de GCC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    warning: passing argument 1 of 'strncpy' from incompatible pointer type
    warning: assignment from incompatible pointer type
    Merci.

  5. #5
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    my_ereg(regex, str, &tab);

  6. #6
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Merci.

    Et pour les warnings ?

  7. #7
    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
    Citation Envoyé par FloMo
    Merci.

    Et pour les warnings ?
    Tu parles de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    *(result + i) = strncpy(*(result + i),
                             str + substr_match[i].rm_so,
                             substr_size);
    sachant que result est un char ** en principe correctement initialisé...

    Déjà, on y verrai plus clair en notation tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       result[i] = strncpy(result[i],
                             str + substr_match[i].rm_so,
                             substr_size);
    ce qui est un non sens. simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       strncpy (result[i],
                   str + substr_match[i].rm_so,
                   substr_size);
    Est-ce que str est bien un pointeur sur char ?
    Est-ce que substr_match[i].rm_so est bien un entier ?

  8. #8
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    j'ai réussi à régler mon problème. C'était juste une histoire de parenthèses mal placées.

    Au final, ce donne :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    void my_ereg ( const char *regex, const char *str, char ***result )
    {
        int         regcomp_options = 0;
        int         regexec_options = 0;
        regex_t     motif;
        int         error = 0;
     
        size_t      message_size = 0;
        char        *message = NULL;
     
        size_t      substr_count = 0;
        size_t      substr_size = 0;
        regmatch_t  *substr_match = NULL;
     
        int i = 0;
     
        /* nothing to do if regular expression is empty */
        if ((regex == NULL) || (str == NULL))
            return;
     
        /* Motif compilation */
        regcomp_options |= REG_EXTENDED;
     
        error = regcomp(&motif, regex, regcomp_options);
     
        /* Catch error */
        if (error != 0) {
            message_size = regerror(error, &motif, NULL, 0);
            message = (char *)malloc(message_size * sizeof(char));
            regerror(error, &motif, message, message_size);
            regfree(&motif);
            error_printf(NON_FATAL, NULL, message);
            free(message), message = NULL;
            exit(EXIT_FAILURE);
        }
     
        /* Prepare sub-expressions */
        substr_count = motif.re_nsub + 1;
        substr_match = calloc(substr_count, sizeof(regmatch_t));
     
        /* Execute regular expression */
        error = regexec(&motif, str, substr_count, substr_match,
                        regexec_options);
     
        if (error != 0) {
            regfree(&motif);
            free(substr_match), substr_match = NULL;
            if (error == REG_NOMATCH)
                return;
            else
                error_printf(FATAL, "regexec", NULL);
        }
     
        /* Allocating memory for results pointers */
        *result = (char **)malloc((substr_count + 1) * sizeof(void *));
     
        /* Parsing results */
        for (i = 0;i < substr_count;i++) {
            substr_size = substr_match[i].rm_eo
                        - substr_match[i].rm_so;
     
            *((*result) + i) = (char *)calloc( substr_size + 1,
                               (substr_size + 1) * sizeof(void *));
            *((*result) + i) = strncpy(*((*result) + i),
                             str + substr_match[i].rm_so,
                             substr_size);
        }
     
        /* Last result is NULL */
        *((*result) + i) = NULL;
     
        free(substr_match), substr_match = NULL;
     
        regfree(&motif);
     
        return;
    } /* my_ereg() */

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

Discussions similaires

  1. [Tabeaux] Tableau multi dimensionnel
    Par jpeg1st dans le forum Langage
    Réponses: 3
    Dernier message: 20/03/2007, 17h06
  2. Réponses: 5
    Dernier message: 04/10/2006, 18h49
  3. [Tableaux] Tableau multi dimensionnel
    Par gids01 dans le forum Langage
    Réponses: 7
    Dernier message: 02/10/2006, 16h18
  4. [Tableaux] tri sur un tableau multi-dimensionnel
    Par nicoaix dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 21h23
  5. Réponses: 4
    Dernier message: 24/08/2005, 14h09

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