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 :

strtoul mal compris... [Débutant(e)]


Sujet :

C

  1. #1
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut strtoul mal compris...
    Bonjour,

    J'essai de comprendre un code source, est je suis arrivé sur cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tHwmcaInitialize.ulEventMask = strtoul(argv[3], (char **)0, 0);
    N'ayant j'amais vue la fonction strtoul, j'ai regardé dans le MAN afin d'essayer de comprendre ce bout de code.
    Apparament cette fonction transforme une chaine en un entier long
    Dans le cas si dessus, la chaine contenu dans argv[3] est convertie en un entier long en base 10 (si j'ai bien compris....)

    2 questions:
    - Que fait le second argument de la fonction (char **)0
    (j'ai pas vraiment compris dans le MAN)

    - Quel est l'intêret d'une telle fonction ?
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut !

    Apparament cette fonction transforme une chaine en un entier long
    Attention, ici elle convertie une chaîne en un entier long non signé !

    Que fait le second argument de la fonction (char **)0
    En fait, si cet argument n'est pas NULL (ici c'est tout comme donc autant mettre NULL, c'est plus simple), la fonction stocke alors l'adresse du premier caractère invalide, donc qui ne participe pas à la conversion !

    Quel est l'intêret d'une telle fonction ?
    Bin imagine que tu as une valeur au début d'une chaîne que tu veux récupérer dans une valeur numérique.... c'est quand rudement pratique d'avoir ce genre de fonction
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Merci pour ces réponse claires.

    Pour finir, cela veut dire que la fonction strtoul permet d'extraire des chiffres d'une chaine de caractères jusqu'au premier caractères différent d'un chiffre (dans le cas d'une base 10: de 0 à 9)

    (je vais me faire un petit pgm pour tester...)
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  4. #4
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Il ne faut pas hésiter à faire des tests lorsqu'on ne comprends pas :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void convert(const char *chaine)
    {
        unsigned long ret;
        char *perr_ch = NULL;
     
        printf("Chaine a convertir : %s\n", chaine);
        ret = strtoul (chaine, &perr_ch, 0);
        printf("Resultat de la conversion : %ld\n", ret);
        if ( strcmp(perr_ch, ""))
        {
            printf ("Chaine non convertie : %s\n", perr_ch);
        }
        printf("\n\n");
    }
     
    int main(void)
    {
        convert("123");
        convert("456abc");
        convert("def789");
        return 0;
    }
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  5. #5
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Merci de votre aide, après un petit test c'est plus clair. Ce qui me perturbais dans cette fonction c'était son utilitée, maintenant je n'ai plus de doute quelle peut s'avérée nécessaire.

    De plus la notation (char **)0 pour un débutant c'est pas évident de voir que c'est équivalent à NULL
    (pourtant j'ai bossé et fais pas mal exercices sur les pointeurs.Je croyais avoir tout compris des pointeurs.....)
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par SPACHFR
    De plus la notation (char **)0 pour un débutant c'est pas évident de voir que c'est équivalent à NULL
    (pourtant j'ai bossé et fais pas mal exercices sur les pointeurs.Je croyais avoir tout compris des pointeurs.....)
    En fait si tu veux tout savoir, dans certaines implémentations (systèmes) NULL est en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define NULL ((void *) 0)
    Si tu vois un peu le rapprochement par rapport à la notation que tu as vu
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. [MySQL] Classe database + connexion multiple + principe mal compris
    Par Rodrigue dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/08/2006, 14h06
  2. [C++]Code mal compris
    Par fafa139 dans le forum MFC
    Réponses: 5
    Dernier message: 11/05/2006, 13h51
  3. [C++]Code mal compris
    Par fafa139 dans le forum C++
    Réponses: 5
    Dernier message: 11/05/2006, 13h51

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